Pic*_*ana 3 string x86 assembly masm nasm
假设我想在运行汇编程序(in section .data)之前定义一个初始化的变量字符串.我选择创建的变量被调用Digits,它是一个包含所有十六进制符号的字符串.
Digits: db "0123456789ABCDEF"
Run Code Online (Sandbox Code Playgroud)
我用变量定义了变量db,这意味着定义了字节.这是否意味着Digits变量长度为8位?这对我来说似乎没有意义,因为:
字符串中的每个字符都是ASCII字符,因此每个字符需要2个字节.总的来说,整个字符串需要32个字节!
那么当我将变量定义为byte时,它意味着什么?字?双字?我没有看到差异.由于我的误解,告诉字符串所需的数据类型似乎是多余的.
PD:这个问题没有帮助我理解.
关联问题的答案之一引用了NASM手册中的例子,它回答了你的问题.根据要求,我将针对所有三种情况进行扩展(并纠正小写与大写ASCII编码错误!):
db 'ABCDE' ; 0x41 0x42 0x43 0x44 0x45 (5 bytes)
dw 'ABCDE' ; 0x41 0x42 0x43 0x44 0x45 0x00 (6 bytes, 3 words)
dd 'ABCDE' ; 0x41 0x42 0x43 0x44 0x45 0x00 0x00 0x00 (8 bytes, 2 doublewords)
dq 'ABCDE' ; 0x41 0x42 0x43 0x44 0x45 0x00 0x00 0x00 (8 bytes, 1 quadword)
Run Code Online (Sandbox Code Playgroud)
所以区别在于,当你使用或代替时,它会用零填充元素大小的倍数.dddwdb
根据@Jose的评论,一些汇编器可能使用不同的字节顺序dd或dw字符串常量.在NASM语法中,字符串始终以与引用常量中出现的顺序相同的顺序存储在内存中.
你可以用NASM组装它(例如进入默认的平面二进制输出)并使用hexdump -C或者某些东西来确认字节顺序和填充量.
请注意,此元素大小的填充适用于每个逗号分隔的元素.所以看似无辜的人dd '%lf', 10, 0实际上是这样组装的:
;dd '%lf', 10, 0
db '%lf',0, 10,0,0,0, 0,0,0,0 ;; equivalent with db
Run Code Online (Sandbox Code Playgroud)
注意0换行之前; 如果你将指针传递给它printf,那么C字符串就是"%lf"由第一个0字节终止的.
(具有显式长度的write系统调用或fwrite函数将打印整个事物,包括0字节,因为这些函数适用于二进制数据,而不是C隐式长度字符串.)