如何在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á
相关产品推荐
相关产品推荐

