gpt4 book ai didi

linux - 从 x86 汇编中的寄存器打印 ASCII 字符范围

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:41:52 27 4
gpt4 key购买 nike

我正在尝试使用此汇编程序打印一系列 ascii 字符。我试图只使用寄存器来做到这一点,但运气不佳。我觉得一切都很好,但我是汇编编程的新手,可能错过了一些明显的东西。任何见解将不胜感激。谢谢 :)

强调文本 。文本 .global_start

_start:
movl $1, %edx

movl $65, %ebx
start_loop:
addl $1, %ebx
movl $0x04, %eax
int $0x80
cmpl $126, %ebx
jle start_loop
jmp start_loop

exit
movl $0, %ebx
movl $1, %eax
int $0x80

最佳答案

您正在调用 sys_write 系统调用。 sys_write() 接受三个参数,输出设备的文件描述符(标准输出应该为 1),存储要打印的值的缓冲区地址,以及要打印的数据的大小。所以你必须在 %ebx 中存储文件描述符,在 %ecx 中存储缓冲区地址,在 %edx 中存储数据大小。要存储文件描述符,您可以使用以下指令。

          movl $1, %ebx        // store 1 (stdout) in ebx)

要存储您可以使用的数据大小:

          movl $1, %edx        // size is 1 byte

现在,您必须存储缓冲区的地址,您需要将数据放在内存中的某个位置,并且需要将内存地址存储在 %ecx 中。假设你想将数据存储在它自己的堆栈中,那么你可以这样做:

          subl $4, %esp     // get 4 bytes of memory in the stack
movl $65, (%esp) // store data in the memory where esp points to
movl %esp, %ecx // store address of the data in the ecx

现在您可以发出 int 0x80。

         movl $04, %eax    // store syscall number in eax    
int $0x80 // issue the trap interrupt

整体可以写如下代码:

    movl $1, %ebx
subl $0x4, %esp
movl $64, (%esp)
start_loop:
movl (%esp), %eax
addl $1, %eax
movl %eax, (%esp)
movl %esp, %ecx
movl $1, %edx
movl $0x04, %eax
int $0x80
movl (%esp), %eax
cmpl $126, %eax
jle start_loop
addl $0x4, %esp

参见 Linux 系统调用第 2 部分 http://www.rulingminds.com/syscallspart2了解有关寄存器和系统调用用法的更多信息。

关于linux - 从 x86 汇编中的寄存器打印 ASCII 字符范围,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7048422/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com