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

EMU8086汇编问题:读取带$的十进制数并计算奇偶性报错

EMU8086汇编:读取键盘输入并输出数字位数与奇偶性

核心问题解答

  • input是无效指令:8086汇编(包括EMU8086)里不存在input指令,键盘输入必须通过DOS中断int 21h的对应功能实现。

汇编读取键盘输入的正确方式

要读取以$结尾的十进制数字字符串,常用两种方法:

  • 用int 21h的01h功能:逐个读取键盘字符,直到读到$为止,同时处理每个数字字符。
  • 用int 21h的0Ah功能:先定义输入缓冲区,一次性读取整行输入,再遍历缓冲区处理到$。

你的代码存在多处逻辑和指令错误,下面是修正后的完整代码及注释:

; 定义数据段
data segment
    input_buf db 10        ; 缓冲区最大容量(最多9个数字+1个$)
              db ?         ; 实际输入的字符数(由DOS自动填充)
              db 10 dup(0) ; 存储输入的字符序列
    num_digits db 0        ; 存储数字的位数
    num_value  dw 0        ; 存储转换后的十进制数值
    newline    db 0Dh, 0Ah, '$' ; 换行符(用于格式化输出)
data ends

; 定义代码段
code segment
assume cs:code, ds:data

start:
    mov ax, data
    mov ds, ax

    ; ---------- 读取键盘输入(以$结尾)----------
    mov ah, 0Ah            ; DOS功能号:带缓冲区的键盘输入
    lea dx, input_buf      ; 指向输入缓冲区首地址
    int 21h                ; 执行DOS中断,读取用户输入

    ; ---------- 处理输入字符串:转数值+统计位数 ----------
    lea si, input_buf+2    ; 指向第一个输入的字符(跳过缓冲区前两个控制字节)
process_char:
    mov al, [si]
    cmp al, '$'            ; 判断是否到达结束符$
    je process_done        ; 是则退出处理循环

    ; ASCII字符转十进制数字:'0'-'9' → 0-9
    sub al, '0'
    mov bl, al
    ; 累加计算完整数值:num_value = num_value * 10 + 当前数字
    mov ax, num_value
    mov dx, 10
    mul dx
    add ax, bx
    mov num_value, ax

    inc num_digits         ; 位数计数器+1
    inc si                 ; 指针移向下一个字符
    jmp process_char

process_done:
    ; ---------- 输出数字位数 ----------
    mov ah, 02h            ; DOS功能号:输出单个字符
    mov dl, num_digits
    add dl, '0'            ; 将数字转成ASCII字符
    int 21h

    ; 输出换行
    mov ah, 09h
    lea dx, newline
    int 21h

    ; ---------- 判断并输出奇偶性 ----------
    mov ax, num_value
    and ax, 1              ; 按位与1,结果为0则是偶数,1则是奇数
    jz print_even
    ; 奇数输出'I'
    mov dl, 'I'
    jmp print_parity
print_even:
    ; 偶数输出'P'
    mov dl, 'P'
print_parity:
    mov ah, 02h
    int 21h

    ; 输出换行
    mov ah, 09h
    lea dx, newline
    int 21h

    ; ---------- 程序正常退出 ----------
    mov ax, 4C00h
    int 21h
code ends
end start

关键修正点说明

  1. 替换无效指令:用DOS 0Ah功能替代不存在的input指令,适配EMU8086运行环境。
  2. 字符串转数值:输入的是ASCII字符,必须通过sub al, '0'转换为十进制数字,再通过乘法累加得到完整数值,才能进行奇偶性判断。
  3. 修正统计逻辑:直接遍历输入字符直到$,每遇到一个数字字符就累加位数,逻辑更准确。
  4. 修复输出功能:输出单个字符需用int 21h的02h功能,原代码误用了0Ah(输入功能)导致输出失败。
  5. 补充变量定义:添加了输入缓冲区、数值存储等必要数据段变量,解决未定义符号的错误。

内容的提问来源于stack exchange,提问作者mimimi

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.06 02:35:16