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

初学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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 21:25:25