汇编:分支程序
一、 实验目的:
- 能够熟练的进行分支程序的编写,掌握条件语句对应的汇编语言指令的实现
- 掌握多个条件的分支语句的实现原理,理解C语言中的逻辑运算“短路”特征
- 熟练利用地址表实现多路分支
二、 实验内容
- 编写汇编语言程序段完成以下的分段函数的值的计算
提示:计算中的变量X,Y为符号数,因此在使用条件转移语句的时候应当用符号数的转移指令
2. 编写汇编语言程序段分别完成以下的两个C语言的功能
#include <stdio.h>
int main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
(m=a<b)||(n=c>d);
printf("%d\t%d",m,n);
}
#include <stdio.h>
int main()
{
int a=5,b=6,c=7,d=8,m=2,n=2;
(m=a>b)&&(n=c>d);
printf("%d\t%d",m,n);
}
提示:注意C语言表达式的计算顺序;“或”逻辑前面为1,“与”逻辑前面为0就会发生短路;编写汇编程序时可以将以上C语言程序中的变量定义为DW
3. 采用地址表的方法编写汇编程序实现以下的C程序的功能
void main()
{
int grade=90;
switch(grade/10)
{
case 9:
printf(“excellence”);
break;
case 8:
printf(“good”);
break;
case 7:
printf(“average”);
break;
case 6:
printf(“pass”);
break;
default:
printf(“fail”);
}}
提示:除以10的时候应当用16位除以8位的除法指令,参考hello world程序中输入字符串的例子输出字符串,参照课本上利用地址表实现多路分支语句。
三、 实验过程
编写源代码,完成后截图源代码
1.
include io32.inc
.data
x byte 3
y byte 5
fxy byte 0
.code
start:
cmp x,1
jge notLessThanOne
cmp y,1
jg notLessThanOne
mov fxy,-1
jmp pEnd
notLessThanOne:
cmp x,1
jl notOneToFive
cmp x,5
jg notOneToFive
cmp y,1
jl notOneToFive
cmp y,5
jg notOneToFive
mov fxy,0
jmp pEnd
notOneToFive:
cmp x,5
jle pEnd
cmp y,5
jle pEnd
mov fxy,1
pEnd:
mov eax,dword ptr fxy
call dispsid
exit 0
end start
2.
include io32.inc
.data
a dword 5
b dword 6
c1 dword 7
d dword 8
m dword 2
n dword 2
.code
start:
;如果m为0,跳过lable1,否则跳转到lable1
mov eax,a
cmp eax,b
jl resualt1
jmp lable1
;比较c1和d
lable1:
mov eax,c1
cmp eax,d
jg resualt2
jmp resualt3
;三种不同的结果组合
resualt1:
mov m,1
jmp output1
resualt2:
mov m,0
mov n,1
jmp output1
resualt3:
mov m,0
mov n,0
;输出
output1:
mov eax,m
call dispsid
mov al,9
call dispc
mov eax,n
call dispsid
exit 0
end start
3.
include io32.inc
.data
score byte 75
branchTable dword branch1,branch2,branch3,branch4
a1 byte 'excellence',0
a2 byte 'good',0
a3 byte 'average',0
a4 byte 'pass',0
a5 byte 'fail',0
.code
start:
mov al,grade
xor ah,ah
mov bl,10
div bl
cmp al,6
jb pEnd
xor ebx,ebx
mov bl,10
sub bl,al
xor bh,bh
dec bl
add bx,bx
add bx,bx
jmp branchTable[ebx]
branch1:
mov eax,offset a1
jmp output
branch2:
mov eax,offset a2
jmp output
branch3:
mov eax,offset a3
jmp output
branch4:
mov eax,offset a4
jmp output
pEnd:
mov eax,offset a5
output:
call dispmsg
exit 0
end start