如果汇编代码指令等同于机器代码指令,我不会理解这些汇编代码和机器代码差异

时间:2016-01-10 21:02:06

标签: assembly executable

有人说汇编语言=机器语言,只是我们在汇编语言中使用助记符。

在阅读了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

在机器代码中?

5 个答案:

答案 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, msgmov r32, imm32编码。 msg的地址最终会填充到链接时指令的4个字节中,因为确定了最终的绝对地址时就是这样。

mov ecx, [msg]将是来自绝对地址(msg的开头)的4字节加载。它将被编码为mov r32, r/m32,使用源的内存操作数编码。

len可能是用equ汇编程序指令定义的。所以它是符号,但它的值不是地址。相反,它的值是asm源文件中的数字。 msg是一个符号,也是一个标签,其值 是一个地址。