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

基于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

关键调整说明

  1. 内存变量存储:在data段定义三个dw类型变量,专门存储三个三位数,避免寄存器占用冲突。
  2. 模块化读取/输出:把读取、输出逻辑封装成子程序,复用代码的同时减少寄存器临时占用。
  3. 三位数数值转换:读取每一位ASCII字符后转成数字,通过乘法和加法组合成完整的三位数(百位100+十位10+个位)。
  4. 简化比较逻辑:用AX作为临时最大值容器,依次对比三个内存中的数值,逻辑清晰且占用寄存器少。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:24:52