从堆栈写入字符的汇编程序

Assembly program to write character from stack

我正在尝试用 AT&T 语法汇编编写一个测试程序,将某些字符的 ascii 值压入堆栈,然后打印它们。我的代码如下:

.text
.global main
main:
    push [=10=]
    push 
    push 
    mov ,%eax
    mov ,%ebx
    mov %esp,%ecx
    mov ,%edx
    int [=10=]x80

    mov ,%eax
    int [=10=]x80

我希望这个程序做的是将 0、10 和 65 压入堆栈,以便堆栈为 65、10、0(大写 A、换行符、字符串结尾)。将 eaxebx 设置为写入标准输出的值,并将 ecx 设置为堆栈指针,以便它写入堆栈上的内容,而 edx 是堆栈上有什么(即 3)。当我 运行 这个时,绝对没有任何反应。你能帮我理解我做错了什么以及这里实际发生了什么吗?

每个push指令将4个字节压入堆栈。所以,这就是堆栈在 int 0x80:

之前的样子
   ....
----------  (highest address)
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x00  |
---------- <-- push [=10=]
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x0A  | 
---------- <-- push 
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x41  |
---------- <-- push  <-- ESP

但是,此时您希望堆栈看起来像:

   ....
---------- 
|  0x00  |
---------- 
|  0x0A  |
---------- 
|  0x41  |
---------- <-- ESP

这可以通过将您的 push 指令替换为以下内容来实现:

push [=12=]x0a41

即:

.text
.global main
main:
    push [=13=]x0a41

    mov ,%eax    ;system call write()
    mov ,%ebx    ;file descriptor (stdout)
    mov %esp,%ecx  ;string
    mov ,%edx    ;length of the string
    int [=13=]x80

    mov ,%eax
    int [=13=]x80

edx 寄存器中您已经指定了字符串的长度(即:3),NUL 字符毫无意义(您是实际上发送到 stdout).