一、实验目的:
掌握组织及调试一个简单并完整的汇编语言程序,熟悉汇编语言上机过程。
二、实验内容:
已知两个整数变量 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