有人说汇编语言=机器语言,只是我们在汇编语言中使用助记符。
在阅读了Petzold" CODE"后,我仍然无法理解一些汇编代码是如何被翻译成机器代码的。
例如(来自Tutorials Point&#39的装配课程):
_start: ;tells linker entry point
mov edx,len ;message length
mov ecx,msg ;message to write
section .data
msg db 'Hello, world!', 0xa ;our dear string
据我所知,msg包含" Hello,world!"并且它已进入ECX。
但据我所知,在x86中,ECX只能存储32位。
然后我们怎样才能移动"你好,世界!" - 超过32位 - 进入ECX?
那部分的等价性是什么
section .data
msg db 'Hello, world!', 0xa ;our dear string
在机器代码中?
答案 0 :(得分:2)
使用.*(?<!part\d*)\.(part\0*1\.)?rar$
定义包含字符串字符串序列的地址。使用msg db
,您只加载此地址而不是其内容。然后可以通过加载[ecx],[ecx + 1]等来加载字符串。
.data定义程序部分。 .text通常包含机器代码,.data可修改的程序代码。可以有更多这样的例如异常处理标签等。
答案 1 :(得分:1)
你的问题很好。它得到了间接的基本计算机概念。
计算机处理一串文本的正常方式,例如&#34; Hello,world!&#34;是将它作为一系列字符保存在内存中。例如:
Memory address Memory contents
8201 'H'
8202 'e'
8203 'l'
8204 'l'
8205 'o'
8206 ','
8207 ' '
... ...
820E 0
此示例中msg
的值为0x8201。它不是'H'
。因此,值0x8201被移动到寄存器ecx
。
稍后,任何想要该消息的人都可以从ecx
中读取0x8201,然后转到内存地址0x8201以查找实际文本消息的开头。这有意义吗?
答案 2 :(得分:1)
语法取决于汇编程序,对于MASM或ML(Microsoft的MASM版本),语法将是
mov ecx,offset msg ;ecx = offset (address) of msg
清楚地表明msg的偏移量或地址被加载到ecx中,而不是msg的前4个字节。
答案 3 :(得分:0)
根据我的理解,命令
mov ecx,msg
实际上并不将整个字符串Hello, world!
移动到寄存器,而是指向其开头的指针。汇编程序指令
msg db 'Hello, world!', 0xa
显然定义了一个包含实际字符串Hello, world!
的内存位置,并且可以由标签msg
引用。但是,实际使用情况有点难以辨别,因为缺少寄存器内容的进一步使用。
答案 4 :(得分:0)
对于x86,英特尔的insn参考手册列出了每条指令的所有编码(参见https://stackoverflow.com/tags/x86/info中的链接)。
mov ecx, msg
是mov r32, imm32
编码。 msg
的地址最终会填充到链接时指令的4个字节中,因为确定了最终的绝对地址时就是这样。
mov ecx, [msg]
将是来自绝对地址(msg的开头)的4字节加载。它将被编码为mov r32, r/m32
,使用源的内存操作数编码。
len
可能是用equ
汇编程序指令定义的。所以它是符号,但它的值不是地址。相反,它的值是asm源文件中的数字。 msg
是一个符号,也是一个标签,其值 是一个地址。