zoukankan      html  css  js  c++  java
  • emu8086实现两位数乘法运算

    题目说明:从键盘上输入任意两个不大于2位数的正实数,计算其乘积,结果在屏幕上显示

    一、准备材料

    DOS功能调用表:https://blog.csdn.net/mybelief321/article/details/13168071

    emu8086软件:https://emu8086-microprocessor-emulator.en.softonic.com/

    ASCII码参考表:http://ascii.911cha.com/

    二、asm代码

    其中的注释详细解释了每一步代码的含义

    由于算法本身的原因,输入的数字必须是两位数,例如:23,05,01,03,99……

    data segment
        num1 db "Enter Number 1: $"
        num2 db "Enter Number 2: $"
        resultstring  db "Num1 * Num2 = Result: $"
        result db 0,0,0,0,"$"
    ends
    
    code segment
    start:
        mov ax, data
        mov ds, ax
        ;将data数据放入data段
                   
        lea dx, num1
        ;将num1的有效地址放入dx
        mov ah, 09h
        ;调用DOS的09H号功能,显示字符串,用来显示“Enter Number 1: ”
        int 21h        
        ;调用DOS
            
        mov ah, 01h
        ;调用DOS的01H号功能:键盘输入并回显。AL存入输入的字符
        int 21h
        ;调用DOS
        sub al, 30h
        ;减去30的原因:键盘键入“1”时,获得1的ASCII码为31,因此减去31,得到真实的数字1, 0~9同理
        mov bl, al
        ;将输入的十位上的数字放入bl
        
        mov al, 0ah
        mul bl
        ;十位上的数字×10 放入ax
        mov bl, al
        ;由于个位数× 0ah 得到的数字总是小于等于两位的,所以AH必定为00H
        
        mov ah, 1h
        int 21h  
        sub al,30h
        ;获得个位上的数字
        add bl, al
        ;个位上的数字 + 十位上的数字×10 = Number 1
        ;此时bl 存入输入的第一个数字的真实大小
        
        mov ah,2
        mov dl,0ah 
        ;调用DOS的02H号功能:显示输出。此时显示的是DL的内容:ASCII(10)为LF 换行
        int 21h
        ;调用DOS
        mov dl,0dh
        ;此时DL为ASCII(15)为CR 回车
        int 21h
        ;调用DOS
        
        
        ;以下为重复输入数字的过程,不再赘述
        lea dx, num2
        mov ah, 9
        int 21h 
        
        mov ah, 1h
        int 21h
        sub al, 30h
        mov dl, al 
        
        mov al, 0ah
        mul dl
        mov dl, al
        
        mov ah, 1h
        int 21h  
        sub al,30h
        add dl, al 
        ;此时dl内存入了Number 2 的真实大小
        
        mov al, bl
        mul dl
        ;此时ax内存入了两数乘积结果(Hex)
        
        mov bx, 0ah
        mov cx, 4
        mov si, 3
        ;si为什么等于3:从第3、2、1、0位开始处理result字段,将每一位结果分别存入个、十、百、千位上
        ; si: 0,  0,  0,  0, "$"
        ;     千   百  十   个
        ;位置  0,  1,  2,  3
        
    getresult:
        mov dx, 0000h
        ;将dx清空,用以以下步骤:
        div bx
        ;ax中的乘积 ÷ 0ah , 商得数会在ax刷新 余数保存在dl
        ;因此dl中现在保存了第si位的数字
        add dl, 030h
        ;转换为ASCII码,显示出字符类型的数字
        mov byte ptr result+si, dl
        sub si, 1
        ;si-=1,下一循环处理低一位的数字
        loop getresult
        
    ;接下来输出提示语:Num1 × Num2 = ……
        mov ah,2
        mov dl,0ah   ;输出换行
        int 21h
        mov dl,0dh   ;输出回车
        int 21h
        lea dx, resultstring
        mov ah, 9
        int 21h
        lea dx, result
    
    display:
        mov ah, 9
        int 21h   
        
        mov ah, 4ch
        mov al, 00h
        ;DOS 4CH号功能:带返回值结束程序,返回值为AL
        int 21h
    ends
    
    end start 

    三、技巧分享

    1、程序捕获到的键盘输入,是按键所代表的ASCII 码,并非其字符本身,例如数字“1”的ASCII 码为31

    2、

    3、

    4、

    5、

  • 相关阅读:
    Oracle11g 修改内存配置
    七.从按键输入到GPIO通用驱动
    三.C语言版本的LED驱动试验
    五.NXP恩智浦官方SDK使用
    前期准备——1.Makefile的使用及基本语法
    八.主频及时钟配置
    四.指针形式对寄存器进行操作(类似STM32效果)
    二.I.MX6U的启动方式
    六.蜂鸣器驱动
    六.项目的BSP工程管理
  • 原文地址:https://www.cnblogs.com/soowin/p/12009138.html
Copyright © 2011-2022 走看看