从堆栈写入字符的汇编程序
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、换行符、字符串结尾)。将 eax
和 ebx
设置为写入标准输出的值,并将 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
).
我正在尝试用 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、换行符、字符串结尾)。将 eax
和 ebx
设置为写入标准输出的值,并将 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
).