【问题标题】:Initialise array of strings in assembly在程序集中初始化字符串数组
【发布时间】:2017-09-01 06:21:30
【问题描述】:

我想在初始化数据部分创建一个包含 5 个字符串的数据数组。每个字符串正好有 4 个字符。每个字符串都有一些初始数据,例如第一个字符串的“abcd”,第二个字符串的“efgh”等等。任何字符串都不需要空 \0 字符。如何用汇编语言初始化字符串数组?

这是我目前能想到的:

string    db    "abcdefghijklmnopqrst"

有没有一些干净的语法或方法?

我正在使用 nasm 处理 64 位代码。

【问题讨论】:

  • 您编码的是 16、32 还是 64 位?你用的是什么汇编程序?更多细节将提供更准确的响应。
  • 您展示的解决方案有什么问题?你在寻找什么样的“干净的语法”?数组只是一个字节序列,没什么神奇的。如果愿意,您可以选择将该数据解释为字符串。
  • 只是我的方法似乎没有直观地表明我们正在初始化一个字符串数组。它看起来像一个字符数组。
  • 在汇编语言中没有字符串数组这样的东西。这只是对您(程序员)选择拥有的数据的一种解释。只有数据。

标签: arrays assembly nasm x86-64


【解决方案1】:

首先:在汇编代码级别没有“数组”的概念,它只是由开发人员解释的位和字节。

为您的示例实现数组的最直接方法是将字符串分解为它们自己的块:

string1: db "abcd"
string2: db "efgh"
string3: db "ijkl"
string4: db "mnop"
string5: db "qrst"

您现在已经创建了可以单独作为一个单元引用的单独的字符串块。最后一步是通过包含 5 个字符串中每个字符串的起始地址的新数据元素来声明“数组”:

string_array: dq string1, string2, string3, string4, string5

上面现在有 5 个地址(每个占用 64 位)。

将数组的地址放入代码段中某处的寄存器中。以下是遍历数组并获取每个字符串本身的一种相当残酷的方法:

xor rdx, rdx            ; Starting at offset zero
lea rdi, [string_array] ; RDI now has the address of the array 
mov rsi, [rdi+rdx]      ; Get the address of string1

; Process String1
; Get next string

add rdx, 8              ; Get the next offset which is 64 bits
mov rsi, [rdi+rdx]      ; Get the address of string2

; Process String2
; etc.

在不知道您对数组做什么的情况下,您的代码方法可能会有所不同。

【讨论】:

  • 我们可以使用mov rdi, string_array移动基数组地址吗?
  • @KapilGarg - 我建议您在此处找到的文档中阅读可以在 nasm 中执行操作的各种方法-> nasm.us
猜你喜欢
  • 2015-06-25
  • 1970-01-01
  • 2011-12-11
  • 1970-01-01
  • 2022-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多