彙編:分支程序
一、 實驗目的:
- 能夠熟練的進行分支程序的編寫,掌握條件語句對應的彙編語言指令的實現
- 掌握多個條件的分支語句的實現原理,理解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