初学emu8086:字符串长度计算与打印代码报错求助
问题分析与解决
首先,你遇到的wrong parameters MOV[dx],al probably it s undefined var [dx]错误,原因是8086汇编不允许直接用DX寄存器作为内存寻址的基址/变址寄存器,只有BX、BP、SI、DI这四个寄存器可以用于内存间接寻址。
其次,你的代码逻辑完全偏离了“计算字符串长度并打印”的需求:原代码调用int 21h的9号功能(打印以$结尾的字符串)后,后续的count_length段逻辑混乱,既没有正确遍历字符串计数,也没有合理使用DOS中断。
修正后的代码
name "Text-Size" code segment assume CS:Code, DS:Code org 100h jmp start start: mov ax, code mov ds, ax ; 先打印原字符串 mov ah, 9 mov dx, offset text int 21h ; 计算字符串长度(到$之前,不包含$) mov si, offset text ; 用SI指向字符串起始地址 mov bl, 0 ; BL作为长度计数器,初始为0 count_length: mov al, [si] ; 读取当前字符 cmp al, '$' ; 判断是否到达结束符$ je print_length ; 是结束符则跳转到打印长度 inc bl ; 计数器加1 inc si ; 指针移动到下一个字符 jmp count_length ; 循环计数 print_length: ; 将BL中的数字转换为ASCII码(仅支持0-9的长度,若要更大数字需额外处理) mov dl, bl add dl, 48 ; 数字转ASCII,48是'0'的ASCII值 mov ah, 2 ; DOS中断2号功能:打印单个字符 int 21h ret text DB 'Hello world',0DH,'$' code ends end
关键修正点说明
- 替换DX为SI用于字符串遍历:用SI寄存器指向字符串地址,符合8086的寻址规则,解决了原代码的语法错误。
- 实现正确的计数逻辑:从字符串起始位置开始,逐个读取字符,直到遇到结束符
$时停止计数,每遍历一个有效字符就将计数器BL加1。 - 合理使用DOS中断:打印字符串用9号功能,打印单个数字用2号功能,确保每个中断调用前都正确设置了AH寄存器的值。
- 补充
end指令:emu8086需要这个指令来标记程序结束,原代码缺少可能导致运行异常。
如果需要支持长度大于9的情况,你需要将BL中的十进制数转换为多字符ASCII输出,比如通过除法取余的方式拆分十位和个位再分别打印。
内容的提问来源于stack exchange,提问作者Moatez larbaa
相关产品推荐
相关产品推荐

