gpt4 book ai didi

linux - 如何在 Linux x86 NASM 中打印字符?

转载 作者:太空狗 更新时间:2023-10-29 11:26:03 26 4
gpt4 key购买 nike

我正在尝试使用 NASM 打印单个字符或数字,目标是 x86 GNU/Linux 架构。

这是我使用的代码:

section .text
global _start

_start:

; Linux printing preparation
mov eax,4
mov ebx,1

; Print 'A' character
mov ecx,'A' ; ecx should contain the value to print
mov edx,1 ; edx should contain how many characters to print
int 80h

; System exit
mov eax,1
mov ebx,0
int 80h

但是,运行此代码不会打印任何内容。我做错了什么?

最佳答案

ecx 应该包含一个指向字符缓冲区开头的指针。所以你必须在内存中有你的缓冲区。您可以执行以下操作:

; Print 'A' character 
mov eax, 4 ; __NR_write from asm/unistd_32.h (32-bit int 0x80 ABI)
mov ebx, 1 ; stdout fileno

push 'A'
mov ecx, esp ; esp now points to your char
mov edx, 1 ; edx should contain how many characters to print
int 80h ; sys_write(1, "A", 1)

; return value in EAX = 1 (byte written), or error (-errno)

add esp, 4 ; restore esp if necessary

您可以 mov byte [esp], 'A' 或任何其他地址,如果可以覆盖堆栈上的任何内容。

或者您可以在 section .rodata 中有一个字符数组,而不是即时存储。


制作a write() system call const void *buf arg 是一些小数字(如 'A')将使其返回 -EFAULT 而不打印任何内容。无论如何,内核必须检查指针,并且系统调用返回一个错误,而不是在坏指针上引发 SIGSEGV。

使用 strace ./my_program 跟踪您实际进行的系统调用,包括解码返回值。

关于linux - 如何在 Linux x86 NASM 中打印字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21429355/

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