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

标签 linux assembly x86 gnu-assembler att

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

.text
.global main
main:
    push $0
    push $10
    push $65
    mov $4,%eax
    mov $1,%ebx
    mov %esp,%ecx
    mov $3,%edx
    int $0x80

    mov $1,%eax
    int $0x80

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

最佳答案

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

   ....
----------  (highest address)
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x00  |
---------- <-- push $0
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x0A  | 
---------- <-- push $10
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x00  |
---------- 
|  0x41  |
---------- <-- push $65 <-- ESP

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

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

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

push $0x0a41

即:

.text
.global main
main:
    push $0x0a41

    mov $4,%eax    ;system call write()
    mov $1,%ebx    ;file descriptor (stdout)
    mov %esp,%ecx  ;string
    mov $3,%edx    ;length of the string
    int $0x80

    mov $1,%eax
    int $0x80

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

关于linux - 从堆栈写入字符的汇编程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48327001/

相关文章:

c - 在特定时间在 C 中执行一个 Action

c++ - 多个数组操作

linux - linux内核线程的上下文

assembly - 向 -Inf : how does it work? 舍入的快速浮点到整数公式

c - 在 macOS 上使用 Xcode 作为 root 运行应用程序时出现非法指令 (ud2)

c++ - 当 2 个线程共享同一个物理内核时,具有错误共享的 volatile 增量在发布时比在调试时运行得更慢

pointers - Nasm - 按值和地址访问结构元素

c++ - 从 Linux OMI (omicli) 到 Windows WMI 的连接失败并出现 DMTF 相关错误

linux - 尝试根据特定准则将文件复制到新目录时陷入困境

java - 阻止 Java 远程访问