两位罗马数字转阿拉伯数字程序无控制台输出故障排查求助
两位罗马数字转阿拉伯数字程序无输出问题排查
你的程序无法输出转换结果的核心问题出在数字输出的sys_write调用部分,具体错误如下:
问题根源
Linux的sys_write系统调用(int 80h,eax=4)要求ecx寄存器传入的是要输出数据的内存地址,而非直接传入字符值。你当前的输出代码:
dale: add al,48 mov edx,1 mov ecx,0 add cl,al mov ebx,1 mov eax,4 int 80h
这段代码把转换后的ASCII字符(存在al中)放到cl寄存器,然后将ecx设为0——相当于让sys_write访问地址0的内存,这属于非法内存访问,必然导致调用失败,因此没有任何输出。
修复步骤
- 在
.bss段新增一个字节的缓冲区,用于存储转换后的ASCII字符:
SECTION .bss inputcislo resb 2 output_char resb 1 ; 新增:存储要输出的ASCII字符
- 修改
dale标签后的输出逻辑,将字符存入缓冲区,再让ecx指向该缓冲区地址:
dale: add al,48 mov [output_char], al ; 将ASCII字符写入内存缓冲区 mov edx,1 mov ecx,output_char ; ecx传入缓冲区的内存地址 mov ebx,1 mov eax,4 int 80h
额外提示(非当前无输出原因)
你的输入读取部分(sys_read,eax=3)设置读取2个字节,但用户输入两位罗马数字后通常会按回车,导致第二个读取到的字节可能是换行符(0xA),这会触发转换逻辑的错误分支。后续可以考虑读取3个字节,或者在读取后校验第二个字符是否为有效罗马数字字符。
内容的提问来源于stack exchange,提问作者IlikeAssemblyButIsuck-sorry
相关产品推荐
相关产品推荐

