NASM计算器无法打印计算结果问题求助
NASM计算器无法显示计算结果的排查方案
以下是针对你问题的核心排查点和解决思路:
检查数值转ASCII字符串逻辑
这是此类问题的高发区:- 确认是否完成了二进制数值到ASCII字符的转换,比如对结果逐位取余10、转换为数字字符后,是否反转了栈中暂存的字符(因为取余得到的是逆序的数字)。
- 转换后的字符串末尾必须添加空终止符
0,否则打印系统调用或自定义打印函数无法正确识别字符串边界。
验证打印结果的系统调用/函数参数
- 打印"Result:"后,是否正确传递了结果字符串的地址给
write系统调用(Linux x86下int 0x80的ecx寄存器需存字符串地址,edx存字符串长度)。 - 如果使用自定义打印函数,检查函数是否正确计算了字符串长度,有没有因长度计算错误导致打印空内容。
- 打印"Result:"后,是否正确传递了结果字符串的地址给
确认计算结果的正确性
用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
相关产品推荐
相关产品推荐

