汇编之分支程序设计

 一、实验目的:

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

 二、实验内容:

  已知两个整数变量 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
原文地址:https://www.cnblogs.com/xuepeng0521/p/3692999.html