我正在阅读Jeff Duntemann撰写的汇编语言逐步编程。
在书中他提到了代码
EatMsg: db "Eat at Joe's",10
mov ecx,EatMsg
不是复制EatMsg的内容,而是复制存储内容的内存。这是理解的,我已通过edb确认。但声明:
EatMsg: dw "Eat at Joe's",10
当我在调试器中检查此代码时,使用db指令时它的内存地址相同,但我也知道dw指的是“定义字”(2字节)。
但有人可以告诉我在执行期间实际发生了什么,CPU一次读一个字,因为dw指令?我正试图想象它。
这本书让我感到困惑,因为他提到通用寄存器会保存定义字符串的地址然后我会阅读下面的摘录并引起混淆:
WordString: dw 'CQ'
DoubleString: dd 'Stop'
DW指令定义了一个字长变量,一个字(16位)可以 保留两个8位字符。类似地,DD指令定义了一个双字 (32位)变量,可以包含4个8位字符。不同的处理方式 将这些命名字符串加载到寄存器中时会出现。考虑这些 两条指令:
mov ax,WordString
mov edx,DoubleString
在第一个MOV指令中,字符“CQ”被放入寄存器AX, AL中的“C”和AH中的“Q”。在第二个MOV指令中,四个 字符“停止”以小端顺序加载到EDX中,其中包含“S” EDX的最低位字节,第二低字节的't',依此类推。 与使用DB定义相比,这种事情要少得多(而且不太有用) 字符串,你不会经常发现自己这样做。 因为eatsyscall.asm没有包含任何未初始化的数据,所以我会坚持 在我们查看下一个示例程序之前讨论这些定义。
CPU如何执行此操作并将db指令用于dw指令的好处是什么?
提前致谢
答案 0 :(得分:0)
你使用哪个汇编程序?在带有字符串的nasm dw
中,只需将字符串填充到两个字节边界。
正在读取的两个和四个字节之间的差异与db
或dw
无关,而是使用ax
(双字节寄存器)与edx
(四字节寄存器)。
加载双字节寄存器将导致读取两个字节的内存。例如,如果您从使用dx
声明的数据中加载dd
,则会得到一个填充了四个字节中的两个的寄存器。
总之,dd
,db
,dw
和朋友只是让汇编程序生成您想到的某些数据的正确二进制表示。最后,它只是一个地址上的二进制数据,如果只有db
,你就可以得到它,只需要更多地思考你的布局。