装配变量赋值

Assembly variable assignment

我正在阅读 Jeff Duntemann 的 Linux 汇编语言分步编程。

书中他提到了代码

EatMsg: db "Eat at Joe's",10
mov ecx,EatMsg

复制的不是EatMsg的内容,而是内容所在的内存。这是理解的,我已经通过 edb 确认了这一点。但是声明:

EatMsg: dw "Eat at Joe's",10

当我在调试器中检查这段代码时,它与使用 db 指令时的内存地址相同,这也是可以理解的,但是我知道 dw,指的是 "define word"(2 个字节)。

但是有人能告诉我执行期间实际发生了什么吗 CPU 由于 dw 指令一次读取一个单词?我正在尝试将其形象化。

这本书让我感到困惑,因为他提到通用寄存器将保存定义字符串的地址,然后我阅读了以下摘录并感到困惑:

WordString: dw 'CQ'
DoubleString: dd 'Stop'

The DW directive defines a word-length variable, and a word (16 bits) may hold two 8-bit characters. Similarly, the DD directive defines a double word (32-bit) variable, which may hold four 8-bit characters. The different handling comes in when you load these named strings into registers. Consider these two instructions:

mov ax,WordString
mov edx,DoubleString

In the first MOV instruction, the characters ‘‘CQ’’ are placed into register AX, with the ‘‘C’’ in AL and the ‘‘Q’’ in AH. In the second MOV instruction, the four characters ‘‘Stop’’ are loaded into EDX in little-endian order, with the ‘‘S’’ in the lowest-order byte of EDX, the ‘‘t’’ in the second-lowest byte, and so on. This sort of thing is a lot less common (and less useful) than using DB to define character strings, and you won’t find yourself doing it very often. Because eatsyscall.asm does not incorporate any uninitialized data, I’ll hold off discussing such definitions until we look at the next example program.

CPU 是如何执行这个的,使用 db 指令对 dw 指令有什么好处?

提前致谢

你使用哪个汇编器?在 nasm dw 中使用字符串只会将字符串填充到两个字节边界。

读取的两个字节和四个字节之间的差异与 dbdw 无关,而是使用 ax(一个两字节寄存器)与 edx(四字节寄存器)。

加载两个字节的寄存器将导致读取两个字节的内存。例如,如果您改为从使用 dd 声明的数据加载 dx,您将得到一个寄存器,其中填充了四个字节中的两个字节。

总而言之,dddbdw 和朋友只是让汇编程序生成您所想的某些数据的正确二进制表示。最后它只是一个地址的二进制数据,如果你只有 db 就可以了,它只会让你更多地考虑布局。