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

如何在emu8086汇编中限制输入数值不超过65535?

限制输入数值≤65535的8086汇编实现

由于emu8086汇编中无法计算超过65535的两数之和,因此需要将输入的数值限制为小于等于65535。以下是实现该需求的汇编代码及关键修改说明:

完整汇编代码

.model small
.stack 100h
.data
 tb1 db 10,13,"输入第一个数: $"
 tb2 db 10,13,"输入第二个数: $"
 tb3 db 10,13,"两数之和为: $"
 tb4 db 10,13,"无效数字,请重新输入: $"
 tb5 db 10,13,"数值超过65535,请重新输入: $" ; 新增超范围提示

 x dw ?
 y dw ?
 z dw ?
 t dw ?
 k dw ?
 
.code
main proc
    mov ax,@data
    mov ds,ax
    
    ; 输入第一个数
    mov ah,9
    lea dx,tb1
    int 21h
    
    call input_number
    mov ax,x
    mov z,ax
    
    ; 输入第二个数
    mov ah,9
    lea dx,tb2
    int 21h
    
    call input_number
    mov ax,x
    mov t,ax
    
    ; 输出两数之和
    mov ah,9
    lea dx,tb3
    int 21h
    
    mov ax,z
    add ax,t
    jc handle_overflow ; 相加溢出则进入处理逻辑
    
    ; 无溢出时直接输出结果
    mov x,ax
    call print
    jmp exit_program
    
handle_overflow:
    mov ax,z
    xor cx,cx
    xor dx,dx
    mov bx,10
    div bx
    
    mov x,ax
    mov k,dx
    
    mov ax,t
    xor cx,cx
    xor dx,dx
    mov bx,10
    div bx
    
    add x,ax ; 相加两数除以10的商
    add dx,k ; 相加两数除以10的余数
    mov k,dx
    cmp k,9
    jl show_result
    jg handle_remainder
    
handle_remainder:
    mov ax,k
    xor cx,cx
    xor dx,dx
    mov bx,10
    div bx
    add ax,dx
    inc x
    mov k,ax
    dec k
    
show_result:
    mov ax,x
    mov x,ax
    call print
    mov ax,k
    mov x,ax
    call print    
    
exit_program:
    mov ah,4ch
    int 21h

main endp

; 输入数字子程序
input_number proc
    mov x,0
    mov y,0
    mov bx,10
    mov cx,5 ; 65535是5位数,最多输入5位

input_loop:
    mov ah,1
    int 21h
 
    cmp al,13
    je submit_input
    
    cmp al,30h
    jb invalid_input
    cmp al,39h
    ja invalid_input
    
    sub al,30h
    xor ah,ah
    mov y,ax
    
    ; 检查计算后是否超过65535
    mov ax,x
    mul bx
    jc overflow_input ; 乘法溢出则超范围
    add ax,y
    jc overflow_input ; 加法溢出则超范围
    mov x,ax
    
    loop input_loop    

submit_input:
    ret

invalid_input:
    mov ah,9
    lea dx,tb4
    int 21h
    jmp input_number

overflow_input:
    mov ah,9
    lea dx,tb5
    int 21h
    jmp input_number

input_number endp

; 输出数字子程序
print proc
    mov ax,x
    mov bx,10
    mov cx,0

divide_loop:
    mov dx,0
    div bx 
    push dx 
    inc cx 
    cmp ax,0 
    je print_digits 
    jmp divide_loop 
                  
print_digits:      
    pop dx
    add dl,30h
    mov ah,2
    int 21h
    dec cx
    cmp cx,0
    jne print_digits
    ret

print endp

end main

关键修改说明

  • 新增超范围提示:在数据段添加tb5,用于提示用户输入的数值超过65535。
  • 输入限制逻辑:在input_number子程序中,每次计算当前值*10 + 输入数字时,通过检查乘法、加法的进位标志(CF)判断是否超过65535,触发溢出则提示错误并重新输入。
  • 修复语法错误:原代码中invalid_number段的jmp main proc是语法错误,修改为jmp input_number实现重新输入。
  • 优化主程序流程:区分无溢出和溢出的情况,无溢出时直接输出结果,逻辑更清晰。

内容的提问来源于stack exchange,提问作者Dương Nguyễn Bá

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 06:55:39