从Emu8086转向x86汇编:打印32位整数无输出问题排查
问题分析与解决
你的核心问题出在对write系统调用参数的理解上,具体错误点如下:
- ecx参数传错了:32位Linux(Chromium OS基于Linux)的
write系统调用中,ecx需要传入的是要输出数据的内存地址,而不是直接传数字1。你直接设ecx=1,相当于让CPU去读取内存地址0x00000001处的内容,这个地址属于内核空间或无效区域,自然没有有效输出。 - edx参数设置不合理:
edx是输出的字节数,你设为16,但你只想输出数字1对应的字符,字节数应该设为1,否则会输出后续内存中的垃圾数据。
修正后的示例代码
section .data num_char db '1' ; 数字1的ASCII码是0x31,存储在data段 section .text global _start _start: mov eax, 4 ; write系统调用号 mov ebx, 1 ; 文件描述符1表示标准输出 mov ecx, num_char ; 指向存储'1'的内存地址 mov edx, 1 ; 输出1个字节 int 0x80 ; 触发系统调用 ; 调用exit系统调用正常退出程序 mov eax, 1 mov ebx, 0 int 0x80
额外说明
如果要输出的是整数1的十进制数值(而非单个字符'1'),你还需要先把整数转换成对应的ASCII字符串——因为write只能输出字节流,无法直接输出整数。比如将整数1转换为字符串"1"后,再输出对应的字节。
内容的提问来源于stack exchange,提问作者Root Groves
相关产品推荐
相关产品推荐

