1、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程;
2、掌握基本汇编语言程序设计方法。
3、熟悉DOSBOX下运行dos程序方法;
4、熟悉debug调式程序的基本方法;
1、数据段中X、Y、Z、V均为字变量,存放的是16位带符号数。编写汇编语言程序计算表达式值(V–(X*Y+Z-720))/X。要求:
(1)使用MASM和LINK生成可执行程序后,使用Debug装入内存;
(2)使用U、D命令查看代码段和数据段的内容,特别注意变量在代码段中的形式;使用G命令执行代码,并查看结果;
(3)用E命令修改各个命令的内容,再次用G命令执行。
2、BL中的只有一位为1。编写程序测试,并输出提示信息“The X Bit is 1”,要求:
(1)使用地址表实现分支功能,在分支中输出提示信息;
(2)程序直接执行,不需要再使用debug。
3、编写一个子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数字数),要求:
(1)输入参数通过堆栈传送,输出参数通过AX传送;
(2)结果需要输出到屏幕上。
1:
详细过程:由题目中“字变量”和“带符号数”的条件,所以在定义数据段时,为X、Y、Z、V分配一个字的空间;然后定义res和rem这两个字单元用来分别存放运算结果的整数部分和小数部分。分别对X、Y、Z、V赋初值或是在DEBUG环境下通过E命令修改初值,如此就可以用不同的数据来验证程序。在有符号数运算中,乘法运算的乘数是字类型,被乘数默认是AX中的内容,得到结果为(DX,AX);除法运算的除数同样也是字类型,除数默认为(DX,AX),但不同的是需要对被除数进行扩展,也就是cwd。最后将结果的整数部分存入res单元中,余数存入rem单元中。
源程序:
stack segment stack
dw 512 dup(?)
stack ends
data segment;在数据段定义数据
x dw 0001h
y dw 0002h
z dw 0003h
v dw 0004h
res dw ?
rem dw ?
data ends
code segment ;(V–(X*Y+Z-720))/X
assume cs:code,ds:data,ss:stack
start: mov ax,data;把data赋给给ax
mov ds, ax;把数据转到数据段寄存器
mov ax,x
imul y
mov cx,ax
mov bx,dx
mov ax,z
cwd
add cx,ax
adc bx,dx;x*y+z
sub cx,720
sbb bx,0;x*y+z-720
mov ax,v
cwd
sub ax,cx
sbb dx,bx;(V–(X*Y+Z-720))
idiv x;(V–(X*Y+Z-720))/X
mov res,ax;把结果整数部分存放在res单元中
mov rem,dx;把结果余数部分存放在rem单元中
mov ah,4ch
int 21h
code ends
end start
2:
详细过程:实验二要求我们使用地址表实现分支功能,并在分支中输出提示信息,所以需要在定义数据段时,使用字单元,实现n号分支地址=入口地址表首地址+n *2;然后题目要求检查bl这八位二进制数中哪一位为1,我想到了使用test命令,在al中放置00000001b,与bl进行test,得到结果便跳转到地址表中相应的提示信息,否则将al左移,继续进行test,直到得到结果。
源程序:
stack segment stack
dw 512 dup(?)
stack ends
data segment;在数据段定义数据
address dw L1,L2,L3,L4,L5,L6,L7,L8;地址表
string1 db 'The 1 Bit is 1 $'
string2 db 'The 2 Bit is 1 $'
string3 db 'The 3 Bit is 1 $'
string4 db 'The 4 Bit is 1 $'
string5 db 'The 5 Bit is 1 $'
string6 db 'The 6 Bit is 1 $'
string7 db 'The 7 Bit is 1 $'
string8 db 'The 8 Bit is 1 $'
string9 db 'No bit is 1 $'
data ends
code segment
assume cs:code,ds:data,ss:stack
start: mov ax, data;把data赋给给ax
mov ds, ax;把数据转到数据段寄存器
mov al,00000001B
mov si,0
mov bl,00000100B;设置bl
cmp bl,0
jz error
mov cx,8
again:
test bl,al
jz next
jmp address[si]
next:
shl al,1
add si,2;指向下一地址
loop again
L1:
mov dx,offset string1
jmp print
L2:
mov dx,offset string2
jmp print
L3:
mov dx,offset string3
jmp print
L4:
mov dx,offset string4
jmp print
L5:
mov dx,offset string5
jmp print
L6:
mov dx,offset string6
jmp print
L7:
mov dx,offset string7
jmp print
L8:
mov dx,offset string8
jmp print
error:
mov dx,offset string9
mov ah,09h
int 21h
print:
mov ah,09h
int 21h
mov ah,4ch
int 21h
code ends
end start
3:
详细过程:实验三要求编写子程序计算z=f(x,y)=x*y+x-y(x,y,z有符号数字数),
因为是有符号数,所以先定义DW类型的x、y、z;而后题目要求输入参数通过堆栈传送,输出参数通过AX传送,所以先分别定义两个子程序input和output实现输入和输出;调用输入子程序input,从键盘输入x、y,得到x、y后通过堆栈传送到计算子程序计算后得到结果在ax,最后调用输出子程序将ax中的结果输出到屏幕上。
源程序:
stack segment stack
dw 512 dup(?)
stack ends
data segment;在数据段定义数据
x dw 0
y dw 0
z dw 0
mes1 db 'Please input x: $';,0dh,0ah,'$'
mes2 db 'Please input y: $';,0dh,0ah,'$'
mes3 db 'The result is: $';,0dh,0ah,'$'
data ends
code segment ;z=f(x,y)=x*y+x-y
assume cs:code,ds:data,ss:stack
start: mov ax,data;把data赋给给ax
mov ds,ax;把数据转到数据段寄存器
mov ah,09h
mov dx,offset mes1;提示输入
int 21h
call input
mov x,ax;输入x
mov ah,09h
mov dx,offset mes2;提示输入
int 21h
call input
mov y,ax;输入y
;计算
push x
push y
call fun
mov z,ax
mov ah,09h
mov dx,offset mes3
int 21h
mov ax,z
call output
jmp done
fun proc near
push bp
mov bp,sp
push bx
push cx
mov cx,[bp+6];提取x
mov bx,[bp+4];提取y
mov ax,cx
imul bx;x*y
add ax,cx;x*y+x
sub ax,bx;x*y+x-y
pop cx
pop bx
pop bp
ret 4
fun endp
input proc near
push bx
push cx
push dx
xor bx,bx;bx保存结果
xor cx,cx;cx为正负标志,0为正,1为负
mov ah,1;输入一个字符
int 21h
cmp al,'+';是“+”,继续输入字符
jz input1
cmp al,'-';是“-”
jnz input2
mov cx,-1;设置-1标志
input1:
mov ah,1
int 21h
input2:
cmp al,'0';不是0~9之间的字符,则输入数据结束
jb input3
cmp al,'9'
ja input3
sub al,30h;是0~9之间的字符,则转换为二进制数
shl bx,1;利用移位指令,实现数值乘10:BX<-BX*10
mov dx,bx
shl bx,1
shl bx,1
add bx,dx
mov ah,0
add bx,ax;已输入数值乘10后,与新输入数值相加
jmp input1;继续输入字符
input3:
cmp cx,0;是负数,进行求补
jz input4
neg bx
input4:
mov ax,bx;设置出口参数
pop dx
pop cx
pop bx
ret;子程序返回
output proc near
push ax
push bx
push dx
test ax,ax
jnz output1
mov dl,'0'
mov ah,2
int 21h
jmp output5
output1:
jns output2
mov bx,ax
mov dl,'-'
mov ah,2
int 21h
mov ax,bx
neg ax
output2:
mov bx,10
push bx
output3:
cmp ax,0
jz output4
sub dx,dx
div bx
add dl,30h
push dx
jmp output3
output4:
pop dx
cmp dl,10
je output5
mov ah,2
int 21h
jmp output4
output5:
pop dx
pop bx
pop ax
ret
done:
mov ah,4ch
int 21h
code ends
end start
1:
将程序装入debug
分别使用u、d、g 命令:
x=1,y=2,z=3,v=4
使用d命令查看结果:结果为02 CF,正确
e命令修改x=20 ,y=30,z=10,v=60 后g命令执行
然后d命令查看,如图所示,结果为FF E9,正确
2:
3:
其他实验:
合肥工业大学2021汇编语言程序设计上机实验二https://blog.csdn.net/qq_52791068/article/details/122703830