基于TASM的汇编入门问题:读取两个多位数并比较大小
嘿,刚入门TASM汇编对吧?你已经搞定了读取单个多位数的核心逻辑,这起步超棒!接下来咱们一步步解决读取第二个数、比较大小并输出结果的问题:
核心思路拆解
咱们要做三件事:
- 读取第一个数并保存到内存(别一直放寄存器里,留着空间给第二个数)
- 读取第二个数同样保存
- 比较两个数,根据结果输出对应的提示
完整修改后的代码
.model small .stack 100h .data ; 定义存储两个数的变量 num1 db 0 num2 db 0 ; 定义输出提示字符串,结尾必须加$(INT 21h 09h功能要求) msg_first db 'Enter first number: $' msg_second db 0ah,0dh,'Enter second number: $' ; 0ah是换行,0dh是回车 msg_larger1 db 0ah,0dh,'First number is larger.$' msg_larger2 db 0ah,0dh,'Second number is larger.$' msg_equal db 0ah,0dh,'Both numbers are equal.$' .code start: mov ax, @data mov ds, ax ; 提示输入第一个数 mov ah, 09h lea dx, msg_first int 21h ; 读取第一个数到num1 mov bl, 0 scanNum1: mov ah, 01h int 21h cmp al, 13 ; 检测回车 je readSecondNum sub al, 48 ; ASCII转十进制 mov cl, al mov al, bl mov dl, 10 mul dl ; 之前的数*10 add al, cl ; 加上新输入的数字 mov bl, al jmp scanNum1 readSecondNum: ; 保存第一个数到内存 mov num1, bl ; 提示输入第二个数 mov ah, 09h lea dx, msg_second int 21h ; 读取第二个数到num2 mov bl, 0 scanNum2: mov ah, 01h int 21h cmp al, 13 ; 检测回车 je compareNums sub al, 48 mov cl, al mov al, bl mov dl, 10 mul dl add al, cl mov bl, al jmp scanNum2 compareNums: ; 保存第二个数到内存 mov num2, bl ; 比较两个数 mov al, num1 cmp al, num2 ja printLarger1 ; 如果num1 > num2,跳转到对应输出 jb printLarger2 ; 如果num1 < num2,跳转到对应输出 ; 否则就是相等 mov ah, 09h lea dx, msg_equal int 21h jmp exitProgram printLarger1: mov ah, 09h lea dx, msg_larger1 int 21h jmp exitProgram printLarger2: mov ah, 09h lea dx, msg_larger2 int 21h exitProgram: mov ah, 04ch int 21h end start
关键部分解释
- 存储数字到内存:把读取到的数从寄存器
BL存到num1/num2,这样读取第二个数时不会覆盖第一个数的值 - 输入提示:用
INT 21h的09h功能输出字符串,0ah,0dh是回车换行的ASCII码,让输入更清晰 - 比较逻辑:用
cmp al, num2后,根据标志位跳转:ja(Jump Above):无符号数大于时跳转jb(Jump Below):无符号数小于时跳转
- 字符串输出要求:所有要输出的字符串必须以
$结尾,这是DOS中断09h的规定
小提醒
因为咱们用的是8位变量(db),所以输入的数不能超过255,否则会溢出哦!如果需要处理更大的数,就得用16位寄存器(比如AX)和变量(dw)来存储啦。
内容的提问来源于stack exchange,提问作者V.Dum
相关产品推荐
相关产品推荐

