8086汇编-用户输入1~100内的任何一个数,完成十进制结果输出

用户输入1~100内的任何一个数,完成十进制结果输出

总体思路是读取用户输入,处理为十进制数,输出到屏幕。首先,需要读取用户的输入。初始化内存和寄存器,清空其中的数据,读入第一个字符

init:               ;初始化
    xor ax, ax      ;清零
    xor bx, bx      ;清零
    xor cx, cx      ;清零
    xor dx, dx      ;清零
    mov ah, 1       ;读一个字符方式
    int 21h         ;中断

未读到非法字符,循环读取

input:              ;循环输入开始
    cmp al, 30h     ;判断'0'
    jb check        ;比0小,跳转
    cmp al, 39h     ;判断'9'
    ja check        ;比9大,跳转
    sub al, 30h     ;ASCII处理
    shl bx, 1       ;bx左移
    mov cx, bx      ;赋值
    shl bx, 1       ;bx左移
    shl bx, 1       ;bx左移
    add bx, cx      ;加和
    add bl, al      ;加和
    mov ah, 1       ;读一个字符方式
    int 21h         ;中断
    jmp input       ;循环输入结束

读到非法字符,判断一下是不是回车。如果是,跳转至保存结果部分

check:              ;检查输入
    cmp al, 0dh     ;输入回车
    je save         ;跳转保存结果
    jmp init        ;输入错误,跳转初始化
save:               ;保存结果
    mov ax, bx      ;ax是结果
    pop dx          ;出栈
    pop cx          ;出栈
    pop bx          ;出栈
    pop bp          ;出栈

把寄存器中的值放入内存数据段

    mov num, ax     ;存入数据段内存
    push num        ;入栈

接下来是输出部分。依然是对十六进制数转换并分解,存入栈中,依次出栈,得到输入的数字。进制转换的部分

divide:             ;进制转换
    xor dx, dx      ;清空
    div bx          ;除以10取余数,dx:ax / bx = ax......dx
    add dl, 30h     ;ASCII转换
    push dx         ;商入栈
    inc cx          ;数字位数+1
    cmp ax, 0       ;商为0,结束
    jne divide      ;商不为0,继续除

循环输出

output:             ;循环输出开始
    pop dx          ;依次弹出结果
    mov ah, 2       ;输出方式
    int 21h         ;中断
    loop output     ;循环输出结束

完整代码

stk segment
stk ends
data segment
    num dw ?
data ends
code segment
    assume cs:code, ss:stk, ds:data
start:
    mov ax, data    ;数据段基址
    mov ds, ax      ;赋值给基址寄存器
;---------------------------------------------------------------
;   输入部分
    push bp         ;入栈
    mov bp, sp      ;栈顶指针
    push bx         ;bx入栈
    push cx         ;cx入栈
    push dx         ;dx入栈
init:               ;初始化
    xor ax, ax      ;清零
    xor bx, bx      ;清零
    xor cx, cx      ;清零
    xor dx, dx      ;清零
    mov ah, 1       ;读一个字符方式
    int 21h         ;中断
input:              ;循环输入开始
    cmp al, 30h     ;判断'0'
    jb check        ;比0小,跳转
    cmp al, 39h     ;判断'9'
    ja check        ;比9大,跳转
    sub al, 30h     ;ASCII处理
    shl bx, 1       ;bx左移
    mov cx, bx      ;赋值
    shl bx, 1       ;bx左移
    shl bx, 1       ;bx左移
    add bx, cx      ;加和
    add bl, al      ;加和
    mov ah, 1       ;读一个字符方式
    int 21h         ;中断
    jmp input       ;循环输入结束
check:              ;检查输入
    cmp al, 0dh     ;输入回车
    je save         ;跳转保存结果
    jmp init        ;输入错误,跳转初始化
save:               ;保存结果
    mov ax, bx      ;ax是结果
    pop dx          ;出栈
    pop cx          ;出栈
    pop bx          ;出栈
    pop bp          ;出栈
;   输入部分结束
;---------------------------------------------------------------
    mov num, ax     ;存入数据段内存
    push num        ;入栈
;---------------------------------------------------------------
;   输出部分
    push bp         ;入栈
    mov bp, sp      ;栈顶指针
    push ax         ;ax入栈
    push bx         ;bx入栈
    push cx         ;cx入栈
    push dx         ;dx入栈
    xor cx, cx      ;cx清空
    mov bx, [bp+4]  ;num放入bx
    mov ax, bx      ;赋值
    mov bx, 10      ;十进制
divide:             ;进制转换
    xor dx, dx      ;清空
    div bx          ;除以10取余数,dx:ax / bx = ax......dx
    add dl, 30h     ;ASCII转换
    push dx         ;商入栈
    inc cx          ;数字位数+1
    cmp ax, 0       ;商为0,结束
    jne divide      ;商不为0,继续除
output:             ;循环输出开始
    pop dx          ;依次弹出结果
    mov ah, 2       ;输出方式
    int 21h         ;中断
    loop output     ;循环输出结束
    pop dx          ;dx出栈
    pop cx          ;cx出栈
    pop bx          ;bx出栈
    pop ax          ;ax出栈
    pop bp          ;bp出栈
;   输出部分结束
;---------------------------------------------------------------
    mov ah, 4ch
    int 21h
code ends
       end start

Q&A

回车怎么打印?

0DH是换行,0AH是回车,将此十六进制数放入ax寄存器并执行中断,将字符输入到屏幕上,就可以完成换行

读和写怎么区分?

01H是写,02H是读,将此十六进制数放入ax寄存器并执行中断,可以向计算机输入字符,或从计算机输出字符

心得

通过本次作业演练,更加加深了对循环和跳转的理解,也对计算机底层寄存器和内存的调用更加熟悉,顺便复习了进制转换的知识

参考资料

  1. gcc编译器的使用

  2. 数据段

  3. 汇编:8086的内存管理方式及数据寻址方式

  4. Intel8086处理器-段寄存器ES/DS/CS/SS与寻址

  5. 8086汇编_常用指令

  6. 8086汇编,十进制转换十六进制

  7. 8086系列(20):十六进制到十进制的转换程序

  8. 8086汇编:输入输出数字、字符、字符串功能

  9. 8086汇编学习之代码段、数据段、栈段与段地址寄存器

  10. 8086CPU中14个寄存器的详解

  11. 汇编语言(十)——条件判断指令

  12. 汇编语言--cmp指令

  13. 汇编语言 CMP指令

  14. 汇编->显示26个英文字母

  15. 汇编语言(第3版)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值