2

如果我使用寄存器而不是内存,为什么它不打印字符?

这是代码:

mov eax,97
mov ebp,eax
call print_char

print_char:
pusha          
mov eax,4       
mov ebx,1       
mov ecx,ebp 
mov edx,1       
int 80h         
popa            
ret
4

1 回答 1

3

并不是您不能使用寄存器……而是您没有提供地址字符串(特别是 C 字符串,一个以空字符结尾的1个字符数组)。

对于那些不熟悉linuxint 80h系统调用的人来说,快速的背景信息,这里是x86 上的调用约定:

System call #  - eax
Parameters     - ebx, ecx, edx, esi, edi, ebp

因此,您正在调用系统调用 4,即sys_write. C签名是:

ssize_t sys_write(unsigned int fd, const char * buf, size_t count)

您可以看到第二个参数 ( ecx) 应该是 a const char* buf,它是一个指向字符串的指针。您正在通过97,这肯定不是一个有效的地址,并且您可能存在段错误。

您的示例的一种快速而简单的方法,它使用堆栈来存储该单字符字符串:

print_char:    # Takes char in ebp
    pusha
    mov    eax, 4     # sys_write
    mov    ebx, 1     # stdout

    push   ebp
    mov    ecx, esp   # buf  (char on stack)

    mov    edx, 1     # just one character
    int    80h        # linux syscall
    pop    ebp
    popa
    ret

这应该将字母“a”(ASCII 97)打印到标准输出。如果你想打印一个十进制的 97,那么就像在 C 中一样,你会从printf家族中调用一些东西,你需要在尝试将它写入之前将该十进制数字转换为字符串stdout


1 - 从技术上讲,这里的字符串不需要以空值结尾,因为您可以指定只打印一个字符。

于 2013-03-19T04:19:48.537 回答