基于TASM 8086实现三位数比较的技术求助
解决TASM 8086三位数比较的寄存器不足问题
要实现三位数比较并输出最大值,核心是用内存变量存储数值来缓解寄存器不足的问题,同时调整读取、比较和输出逻辑适配三位数。以下是修改后的完整代码:
data segment msg1 db 'Enter first 3-digit number: $' msg2 db 0ah,0dh,'Enter second 3-digit number: $' msg3 db 0ah,0dh,'Enter third 3-digit number: $' msg4 db 0ah,0dh,'Greatest number is: $' num1 dw ? ; 存储第一个三位数(word类型足够存0-999) num2 dw ? num3 dw ? data ends code segment start: mov ax, data mov ds, ax ; 读取第一个三位数 mov ah, 09h lea dx, msg1 int 21h call read_3digit_num mov num1, ax ; 读取第二个三位数 mov ah, 09h lea dx, msg2 int 21h call read_3digit_num mov num2, ax ; 读取第三个三位数 mov ah, 09h lea dx, msg3 int 21h call read_3digit_num mov num3, ax ; 找出最大值 mov ah, 09h lea dx, msg4 int 21h mov ax, num1 cmp ax, num2 jge compare_num1_num3 mov ax, num2 compare_num1_num3: cmp ax, num3 jge print_max mov ax, num3 print_max: call print_3digit_num jmp done ; 读取三位数并返回AX中(数值型) read_3digit_num proc push bx push cx push dx ; 读取百位 mov ah, 01h int 21h sub al, 30h ; ASCII转数字 mov cl, al mov ax, 0 mov ch, 0 mov bx, 100 mul bx ; 百位*100,结果在AX mov dx, ax ; 临时存到DX ; 读取十位 mov ah, 01h int 21h sub al, 30h mov cl, al mov ax, 0 mov ch, 0 mov bx, 10 mul bx ; 十位*10,结果在AX add dx, ax ; 加到DX中 ; 读取个位 mov ah, 01h int 21h sub al, 30h mov cl, al mov ax, 0 mov ch, 0 add dx, cx ; 加上个位数字 mov ax, dx ; 最终三位数存入AX返回 pop dx pop cx pop bx ret read_3digit_num endp ; 输出AX中的三位数(数值型转ASCII) print_3digit_num proc push bx push cx push dx ; 拆分百位 mov cx, 100 div cx ; AX / 100,商AL=百位,余数AH=后两位 mov dl, al add dl, 30h ; 转ASCII mov ah, 02h int 21h ; 拆分十位 mov al, ah mov ah, 0 mov cx, 10 div cx ; AX /10,商AL=十位,余数AH=个位 mov dl, al add dl, 30h int 21h ; 输出个位 mov dl, ah add dl, 30h int 21h pop dx pop cx pop bx ret print_3digit_num endp done: mov ah, 4ch int 21h code ends end start
关键调整说明
- 内存变量存储:在
data段定义三个dw类型变量,专门存储三个三位数,避免寄存器占用冲突。 - 模块化读取/输出:把读取、输出逻辑封装成子程序,复用代码的同时减少寄存器临时占用。
- 三位数数值转换:读取每一位ASCII字符后转成数字,通过乘法和加法组合成完整的三位数(百位100+十位10+个位)。
- 简化比较逻辑:用AX作为临时最大值容器,依次对比三个内存中的数值,逻辑清晰且占用寄存器少。
内容的提问来源于stack exchange,提问作者Deadly Kohol
相关产品推荐
相关产品推荐

