实验一 基本汇编程序设计
实验目的
1、熟悉DEBUG程序中的命令,学会在DEBUG下调试、运行汇编语言源程序的方法。
2、熟悉在PC机上建立、汇编、连接、调试和运行8086/8088汇编语言程序的过程;
3、熟悉debug调式程序的基本方法;
4、掌握基本汇编语言程序设计方法。
实验内容
1、利用DEBUG程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:0200H和DS:0204H两个单元中;实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。
2、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:计算表达式值(V–(X*Y+Z-720))/X,将运算结果整数放在SUM1单元,余数放在SUM2单元。
实验提示(参考第3章和Debug部分的PPT):
(1) 在DOSBOX编译链接成可执行文件后,使用Debug装入内存。
(2) 使用U命令反汇编代码,并与源文件比对,需要注意数据段名、变量转入内存后的形式。
(3) 分别在G命令执行前后,使用D命令查看各个变量的值。
3、BL中的只有一位为0,编写程序测试0所在的位数(从左编号,最左边为第0位),并输出提示信息“The X Bit is 0”(X为0、1、2、3…7),要求使用地址表方法实现。
实验提示:从本实验开始,除非需要调试程序,不得再使用Debug方式执行程序;直接在DosBox下输入可执行程序名运行程序,获取结果。
4、在内存Score缓冲区中存放有100个学生的成绩数据,为无符号字节数。设 计程序完成如下功能:根据用户输入的一个2位十进制数,作为查找对象,在该数组中查找,若找到则显示“Y”,若没找到则显示“N”。
实验过程和程序
利用DEBUG程序中的“E”命令,将两个多字节数“12345678H”和“FEDCBA98H”分别送入起始地址为DS:0200H和DS:0204H两个单元中;实现将DS:0200H单元和DS:0204H单元中的数据相加,并将运算结果存放在DS:0208H单元中。
-E DS:0200 78 56 34 12 98 BA DC FE
-A
MOV AX,[200]
ADD AX,[204]
MOV BX,[202]
ADC BX,[206]
MOV [208],AX
MOV [20A],BX
G=100 116
2、X、Y、Z、V均为字变量,在X、Y、Z、V字单元中存放是16位带符号数。试编写汇编语言程序完成以下功能:计算表达式值(V–(X*Y+Z-720))/X,将运算结果整数放在SUM1单元,余数放在SUM2单元。
实验提示(参考第3章和Debug部分的PPT):
(1) 在DOSBOX编译链接成可执行文件后,使用Debug装入内存。
STACK SEGMENT STACK
DW 512 DUP(?)
STACK ENDS
DATA SEGMENT
X DW 3
Y DW 123
Z DW 82
V DW 20
SUM1 DW ?
SUM2 DW ?
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START: MOV AX,DATA
MOV DS,AX
MOV AX,X ;将X中的数据放入AX中
MOV BX,Y
IMUL BX ;X*Y
MOV CX,AX
MOV BX,DX ;保存x*y到BX:CX中
MOV AX,Z
CWD ;拓展寄存器DX
ADD AX,CX ;X*Y+Z
ADC DX,BX ;加上进位
SUB AX,720 ;X*Y+Z-720
SBB DX,0 ;减去借位
MOV CX,AX
MOV BX,DX ;保存X*Y+Z-720到BX:CX中
MOV AX,V
CWD
SUB AX,CX ;V-(X*Y+Z-720)
SBB DX,0 ;减去借位
MOV BX,X
IDIV BX ;V-(X*Y+Z-720)
MOV SUM1,AX ;商
MOV SUM2,DX ;余数
MOV AX,4C00H
INT 21H
CODE ENDS
END START
(2) 使用U命令反汇编代码,并与源文件比对,需要注意数据段名、变量转入内存后的形式。
(3) 分别在G命令执行前后,使用D命令查看各个变量的值。
3、BL中的只有一位为0,编写程序测试0所在的位数(从左编号,最左边为第0位),并输出提示信息“The X Bit is 0”(X为0、1、2、3…7),要求使用地址表方法实现。
实验提示:从本实验开始,除非需要调试程序,不得再使用Debug方式执行程序;直接在DosBox下输入可执行程序名运行程序,获取结果。
STACK SEGMENT STACK
DW 512(?)
STACK ENDS
DATA SEGMENT
STR DW L0,L1,L2,L3,L4,L5,L6,L7 ;地址表
S0 DB 'The 0 Bit is 0$'
S1 DB 'The 1 Bit is 0$'
S2 DB 'The 2 Bit is 0$'
S3 DB 'The 3 Bit is 0$'
S4 DB 'The 4 Bit is 0$'
S5 DB 'The 5 Bit is 0$'
S6 DB 'The 6 Bit is 0$'
S7 DB 'The 7 Bit is 0$'
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
MOV BL,11111110B ;待测试的数据,从左往右第7位是0
MOV CX,8
MOV AL,BL
MOV BX,0
AGAIN:
SHL AL,1
JNC GET ;当cf = 0,就是找到了唯一的0位,跳出循环
INC BX
LOOP AGAIN
JMP DOWN ;如果程序到这里说明没有找到0位,程序直接结束
GET:
SHL BX,1
JMP STR[BX]
L0: MOV DX,OFFSET S0
JMP SHOW
L1: MOV DX,OFFSET S1
JMP SHOW
L2: MOV DX,OFFSET S2
JMP SHOW
L3: MOV DX,OFFSET S3
JMP SHOW
L4: MOV DX,OFFSET S4
JMP SHOW
L5: MOV DX,OFFSET S5
JMP SHOW
L6: MOV DX,OFFSET S6
JMP SHOW
L7: MOV DX,OFFSET S7
JMP SHOW
SHOW:
MOV AH,09H
INT 21H
DOWN:
MOV AX,4C00H
INT 21H
CODE ENDS
END START
4、在内存Score缓冲区中存放有100个学生的成绩数据,为无符号字节数。设 计程序完成如下功能:根据用户输入的一个2位十进制数,作为查找对象,在该数组中查找,若找到则显示“Y”,若没找到则显示“N”。
STACK SEGMENT STACK
DW 512(?)
STACK ENDS
DATA SEGMENT
SCORE DB 10 DUP(0,10,20,30,40,50,60,70,80,90) ;为了程序方便,以十组一样的数据存在内存中代替一百个学生的成绩
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK
START:
MOV AX,DATA
MOV DS,AX
LEA BX,SCORE ;拿到成绩数据首地址
MOV CX,100 ;循环100次,遍历所有学生成绩
MOV SI,0
MOV AH,01H ;输入一个字符,表示十位
INT 21H
AND AX,000FH
MOV DL,10
MUL DL
MOV DL,AL ;保存AL
MOV AH,01H ;输入一个字符,表示个位
INT 21H
AND AX,000FH
ADD AL,DL ;将输入成绩保存在DH中
MOV DH,AL
MOV AH,2
MOV DL,10 ;回车
INT 21H
MOV AH,2
MOV DL,13 ;换行
INT 21H
AGAIN:
MOV DL,[BX+SI]
CMP DH,DL
JE DOWN
INC SI
LOOP AGAIN
MOV DL,'N'
JMP SHOW ;运行到这里说明找不到对应的学生
DOWN:
MOV DL,'Y'
SHOW: MOV AH,02
INT 21H
MOV AX,4C00H
INT 21H
CODE ENDS
END START