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
关键修正点说明
- 替换无效指令:用DOS 0Ah功能替代不存在的
input指令,适配EMU8086运行环境。 - 字符串转数值:输入的是ASCII字符,必须通过
sub al, '0'转换为十进制数字,再通过乘法累加得到完整数值,才能进行奇偶性判断。 - 修正统计逻辑:直接遍历输入字符直到
$,每遇到一个数字字符就累加位数,逻辑更准确。 - 修复输出功能:输出单个字符需用
int 21h的02h功能,原代码误用了0Ah(输入功能)导致输出失败。 - 补充变量定义:添加了输入缓冲区、数值存储等必要数据段变量,解决未定义符号的错误。
内容的提问来源于stack exchange,提问作者mimimi
相关产品推荐
相关产品推荐

