• 汇编之分支程序设计


     一、实验目的:

      掌握组织及调试一个简单并完整的汇编语言程序,熟悉汇编语言上机过程。

     二、实验内容:

      已知两个整数变量 A 和B,试编写完成下述操作的程序:

      (1)、若两个数中有一个是奇数,则将奇数存入A 中,偶数存入B 中。

      (2)、若两个数均为奇数,则两数分别加1,并存回原变量。

      (3)、若两个数均为偶数,则两变量不变。

       三、实验步骤:

      (1)、分析所要解决的问题,确定适当的算法。本实验中需考虑如何确定一

      个整数的奇偶。

      对于任意输入的2个数,通过Test指令和JZ指令组合分别判断A、B的奇偶性。

      奇偶性有4种可能。A奇B奇,A奇B偶,A偶B奇,A偶B偶。

      其中A奇B奇执行A、B各自加1,通过add指令实现。

       A偶B奇执行A、B交换位置,可借助AL、BL或者其他寄存器以及MOV指令实现。

       A奇B偶和A偶B偶都不执行任何操作。

      最后依次输出即可。

      (2)、设计整个程序的逻辑结构,画出程序流程图。如下所示:

      

      四、源代码

      

      1 DATAS SEGMENT
      2     A DB ?
      3     B DB ?
      4     String db 'please input two numbers:$'
      5     StringA DB  13,10, 'A=','$'
      6     StringB DB  13,10,'B=','$' ;13是回车,10是换行, $是字符串结束符
      7     NewLine DB  13,10,'$'
      8 DATAS ENDS
      9  
     10 STACKS SEGMENT
     11 STACKS ENDS
     12  
     13 CODES SEGMENT
     14     ASSUME CS:CODES,DS:DATAS,SS:STACKS
     15 START:
     16     MOV AX,DATAS
     17     MOV DS,AX
     18      
     19     lea dx, string;提示用户输入2个数,调用中断类型是21H,9号命令
     20     mov  ah,9
     21     int  21H
     22     
     23     lea  dx,stringA
     24     MOV  ah,9
     25     INT  21H
     26 
     27     call inproc;调用输入函数
     28     mov A, bl  ;输入第一个数 
     29 
     30     lea  dx,stringB
     31     mov  aH,9
     32     int  21H
     33      
     34     call inproc
     35     mov B,bl  ;输入第二个数 
     36      
     37     TEST A,01H;判断奇偶性
     38     JZ flag1 ;累加器为0(判断为偶数)则跳转
     39     TEST B,01H
     40     JZ flag2
     41     
     42     ;没跳转,说明2个奇数,各自加1
     43     ;-------------------------------------------
     44     ADD A,1
     45     ADD B,1
     46     JMP flag2
     47     ;-------------------------------------------
     48 
     49     ;A为偶数,判断B
     50     ;-------------------------------------------     
     51 flag1:
     52     TEST B,01H
     53     JZ flag2
     54     MOV AL,A
     55     MOV AH,B
     56     MOV B,AL
     57     MOV A,AH
     58     
     59     ;2个都是偶数,无操作,输出
     60     ;-------------------------------------------   
     61 flag2:
     62       mov bl, A;输出A
     63       LEA  dx,stringA
     64     MOV  ah,9
     65     INT  21H
     66       call disp10
     67       
     68       LEA  DX,newline ;换行
     69     MOV  AH,9
     70     INT  21H
     71     
     72       mov bl, B;输出B
     73       LEA  dx,stringB
     74     MOV  ah,9
     75     INT  21H
     76       call disp10 
     77       
     78       mov ax, 4c00h;程序结束符
     79       int 21h
     80     ;---------------------------------------------
     81     
     82     
     83     ;输入
     84     ;---------------------------------------------
     85     inproc proc
     86         mov bl,0
     87         mov cl, 10;进制乘位
     88         lop1: 
     89         mov ah,01;带回显的键盘输入
     90         int 21h
     91         
     92         ;输入空格,输入结束
     93         cmp al,20h
     94         jz exit
     95         
     96         ;输入回车,结束
     97         cmp al,0dh
     98         jz exit
     99         
    100         sub al,30h ;必须注意当你在调用1号中断后存放在al寄存器的是输入字符的ASCSII,
    101                  ;必须减去30H或37H(十六进制中ABCDEF等字符)才是你想要的数值。
    102         xchg al,bl
    103         mul cl;每输入一位,之前数*10
    104         add bl,al;再加当前数
    105         jmp lop1
    106         exit: ret
    107     inproc endp
    108     ;----------------------------------------------------
    109     
    110     ;8位2进制数,十进制输出
    111     ;---------------------------------------------------------
    112     disp10 proc
    113            mov ah,0
    114            mov al,bl
    115            mov bh,100;db型数据十进制最大3位
    116            div bh       ;
    117            mov bl,ah;余数
    118            mov dl,al;
    119            cmp dl,0;比较当前输出位是否为0
    120            jz jump1
    121            add dl,30H
    122            mov ah,02
    123            int 21h
    124     jump1: mov al,bl
    125            mov ah,0
    126            mov bh,10
    127            div bh
    128            mov bl,ah
    129            mov dl,al
    130            cmp dl,0
    131            jz jump2
    132            add dl,30h;转换为ascll码输出
    133            
    134            ;显示一个字符
    135            mov ah,02
    136            int 21h
    137      jump2: mov dl,bl
    138            add dl,30h
    139            mov ah,02
    140            int 21h
    141            ret
    142            disp10 endp
    143     ;--------------------------------------------------------- 
    144 CODES ENDS
    145     END START
  • 相关阅读:
    杯具的流浪狗
    数据加密与数据压缩后加密的效率
    XMPP协议自定义消息类型扩展
    have a try
    linux修改网卡名称的方法
    WARNING: old character encoding and/or character set解决办法
    extern用法总结
    linux下的c++线程池实现
    32位linux系统操作大于2G文件方法
    eclipse中gdb调试输出stl容器的内容
  • 原文地址:https://www.cnblogs.com/xuepeng0521/p/3692999.html
Copyright © 2020-2023  润新知