打印到控制台 - > ecx和edx寄存器中内容的模糊性

时间:2016-02-22 15:11:29

标签: assembly nasm inline-assembly

来自我之前的疑问 - Difference between “mov eax, [num]” and “mov eax, num”

我开始知道“mov eax,num”将在eax中存储 num 的地址,而“mov eax,[num]”将在eax中存储 num的值

现在在这里!

    mov     edx, strLen     ; Arg three: the length of the string
    mov     ecx, str        ; Arg two: the address of the string
    mov     ebx, 1          ; Arg one: file descriptor, in this case stdout
    mov     eax, 4          ; Syscall number, in this case the write(2)  

    int     0x80            ; Interrupt 0x80   

section .data     
    str:     db 'Hello, world!',0xA
    strLen:  equ $-str

理想情况下,edx寄存器应该有长度,所以

  • as“ mov ecx,str ” - 在ecx中存储 str 的地址
  • 没有“ mov edx,strlen ”也应该存储strlen的地址而不是edx中的值。
  • 在edx中存储 strlen的值,为什么我们不使用“ mov edx,[strlen]

此链接引用了以下代码 - http://asm.sourceforge.net/intro/hello.html

它杀了我!

提前致谢...

1 个答案:

答案 0 :(得分:1)

strLen等同于strLen: equ $-str)。所以,正在发生的只是从mov edx, strLenmov edx, 14的编译时文本替换。

在这里使用括号是不正确的,因为这会给你mov edx, [14],这不是你想要做的。

(参见章节3.2.4 EQU:在NASM手册中定义常数)