x86 nasm汇编如何正确打印乘法运算结果?现有代码运行异常怎么解决?
代码错误分析与修正方案
你的代码存在以下3处核心错误,导致无法正常输出计算结果:
- 系统调用参数逻辑错误:Linux 32位环境下
int 0x80触发的sys_write系统调用(调用号为4),要求ecx寄存器传入待输出字符的内存地址,你当前直接把转义后的ASCII字符值赋值给ecx,相当于让内核访问非法内存地址,自然无法打印出预期内容。 - 除法与终止判断逻辑漏洞:你使用16位寄存器
bx作为除数执行div bx时,默认被除数是dx:ax组成的32位值,且运算后商存在ax而非仅al中,你只判断al是否为0的终止逻辑,会在商大于255时直接提前终止循环,导致输出位数缺失。 - AAM指令误用:
aam指令仅支持对al中0~99范围的二进制数转非压缩BCD码,你计算12*12得到的乘积是144,已经超出aam的有效输入范围,执行后会直接破坏ax中存储的正确乘积结果,这行指令属于冗余错误逻辑,可以直接删除。
修正后的核心代码示例
mov al, 12 mov bl, 12 mul bl ; 乘积144正确存储在ax中,删除冗余的aam指令 mov bx, 10 xor cx, cx .a: xor dx, dx div bx ; 商在ax,余数在dx push dx ; 直接压入余数即可 inc cx test ax, ax ; 判断整个ax是否为0作为循环终止条件 jnz .a ; 在栈上开辟1字节缓冲区,解决sys_write需要传内存地址的问题 sub sp, 1 .b: pop dx add dl, '0' mov [esp], dl ; 把待打印字符写入栈缓冲区 mov eax, 4 mov ebx, 1 mov ecx, esp ; ecx传入缓冲区地址 mov edx, 1 int 0x80 loop .b add sp, 1 ; 执行完后恢复栈空间
内容的提问来源于stack exchange,提问作者Lauri
相关产品推荐
相关产品推荐

