NASM汇编加减法代码无输出:如何实现输出150和48?
NASM汇编加减运算无输出问题的修复方案
原代码存在三个核心问题导致无正确输出:
sys_write(int 0x80,eax=4)要求ecx指向内存中字符串的起始地址,但你直接传入了数值本身,且数值不是ASCII编码,系统无法识别输出内容- 运算结果(150、48)是多位数,需要先将十进制数值转换为ASCII字符串才能逐字符输出
display_result中的exit代码块会直接终止程序,导致减法运算的结果无法执行输出
以下是修复后的完整代码:
section .data num1 db 99 num2 db 51 result_buf db '000', 0xA ; 预留3位数字+换行的缓冲区 newline db 0xA section .text global _start _start: ; 加法运算 mov al, [num1] add al, [num2] call num_to_str ; 将al中的数值转为ASCII字符串存入result_buf call display_result ; 减法运算 mov al, [num1] sub al, [num2] call num_to_str call display_result ; 退出程序 mov eax, 1 xor ebx, ebx int 0x80 ; 将al中的8位无符号数转为十进制ASCII字符串,存入result_buf num_to_str: mov cl, 10 mov edi, result_buf + 2 ; 从缓冲区末尾开始填充(倒序) ; 提取个位 xor ah, ah div cl add ah, '0' mov [edi], ah dec edi ; 提取十位 xor ah, ah div cl add ah, '0' mov [edi], ah dec edi ; 提取百位 add al, '0' mov [edi], al ret ; 输出result_buf中的字符串(3位数字+换行) display_result: mov edx, 4 ; 输出长度:3位数字+1个换行 mov ecx, result_buf mov ebx, 1 mov eax, 4 int 0x80 ret
关键修改说明:
- 新增数值转ASCII函数
num_to_str:- 利用除法提取每一位数字,加上
'0'转为ASCII字符 - 从缓冲区末尾倒序填充,保证最终字符串是正序的十进制数字
- 利用除法提取每一位数字,加上
- 调整输出逻辑:
- 使用
result_buf存储转换后的ASCII字符串,sys_write直接指向该缓冲区地址 - 固定输出长度为4(3位数字+换行),确保多位数能完整输出
- 使用
- 移除
display_result中的退出代码:- 改用
ret返回调用处,保证加法完成后能继续执行减法运算
- 改用
- 规范退出调用:
- 退出时将ebx设为0(正常退出码),符合Linux系统调用规范
内容的提问来源于stack exchange,提问作者JpegNasm
相关产品推荐
相关产品推荐

