You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NASM计算器无法打印计算结果问题求助

NASM计算器无法显示计算结果的排查方案

以下是针对你问题的核心排查点和解决思路:

  • 检查数值转ASCII字符串逻辑
    这是此类问题的高发区:

    • 确认是否完成了二进制数值到ASCII字符的转换,比如对结果逐位取余10、转换为数字字符后,是否反转了栈中暂存的字符(因为取余得到的是逆序的数字)。
    • 转换后的字符串末尾必须添加空终止符0,否则打印系统调用或自定义打印函数无法正确识别字符串边界。
  • 验证打印结果的系统调用/函数参数

    • 打印"Result:"后,是否正确传递了结果字符串的地址给write系统调用(Linux x86下int 0x80的ecx寄存器需存字符串地址,edx存字符串长度)。
    • 如果使用自定义打印函数,检查函数是否正确计算了字符串长度,有没有因长度计算错误导致打印空内容。
  • 确认计算结果的正确性
    用gdb调试,在运算结束后查看存储结果的寄存器(比如eax)值,确认加减运算确实得到了正确的数值,排除运算逻辑本身的错误。

参考数值转字符串实现(Linux x86)

; 功能: 将eax中的整数转换为ASCII字符串存入buf
; 输入: eax = 待转换整数
; 输出: buf = 转换后的ASCII字符串(带空终止符)
num_to_str:
    push ebx ecx edx esi
    mov esi, buf
    mov ecx, 10         ; 除数为10
    xor ebx, ebx        ; 记录数字位数

.next_digit:
    xor edx, edx
    div ecx             ; eax = 商, edx = 余数
    add dl, '0'         ; 余数转ASCII字符
    push edx            ; 逆序暂存到栈
    inc ebx
    test eax, eax
    jnz .next_digit

.reverse:
    pop edx
    mov [esi], dl
    inc esi
    dec ebx
    jnz .reverse
    mov byte [esi], 0   ; 添加空终止符

    pop esi edx ecx ebx
    ret

section .bss
buf resb 10            ; 分配足够存储整数的缓冲区

打印结果的示例代码

; 假设已完成数值转换,buf为结果字符串
mov eax, 4
mov ebx, 1
mov ecx, buf
; 计算字符串长度(可在num_to_str中记录长度到ebx,直接使用)
mov edx, 10
int 0x80

内容的提问来源于stack exchange,提问作者Char Ems

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 08:40:01