实验一 内存操作数及寻址方法
实验目的
8088指令:
MOV,ADD,ADC,SUB,SBB,DAA,XCHG
8088寄存器: AX,BX,CX,DX,FL,IP
BCD码,用16进制数表示二进制码的方法。
8088系统中数据在内存中的存放方式和内存操作数的几种寻址方式。 8088汇编语言伪操作:BYTE PTR,WORD PTR。 求累加和程序和多字节加减法程序
实验内容
(按照实验装置要求的程序格式输入程序后单步调试): 示例:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ;定义段
ORG 2000H ;此代码段起始地址偏移2000H SL: 。。。。。。。 ;程序第一条可执行语句的标号名 。。。。。。。 。。。。。。。 JMP $ CODE
注解:因为实验装置中存储范围不超过64K,即不超过一个段的范围,所以对段的定义都是在一个段内
[ ASSUME
CS:CODE,DS:CODE,ES:CODE ]段值都为0000H; 用户程序区 用户数据区 ORG
通过实验掌握下列知识
0000:1000—7FFFH 0000:1000—7FFFH ;死循环,目的是强制程序结束
ENDS ;标记汇编源程序结束 END
SL ;后面带的标号为主程序模块中的标号名称
2000H ;此代码段起始地址必须在上面指定范围内(1000—7FFFH);
SL: 。。。 ;程序第一条可执行语句的标号名可自己按要求定义。
8088常用指令练习
1、传送指令
在内存1000H处写入下列程序:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG SL: MOV MOV
1000H AX,1234H BX,5678H
XCHG AX,BX MOV AH,35H MOV
AL,48H
4
MOV DX,75ABH
XCHG AX,DX JMP $ CODE ENDS END SL 2、加减法指令
在内存2000H处写入下列程序:
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG
2000H
SL: MOV AH,34H
MOV AL,22H ADD AL,AH SUB AL,78H MOV CX,1284H MOV DX,5678H ADD CX,DX SUB CX,AX SUB CX,CX
JMP
CODE ENDS
$
END SL 3、带进位加减法
在内存3000H处写入下列程序:
CODE
SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3000H SL: MOV AH,12H MOV AL,84H MOV CH,56H
MOV CL,78H ADD AL,CL ADC AH,CH MOV DH,0A7H MOV DL,58H SUB DL,7FH SBB DH,34H
JMP
CODE ENDS
$
END SL
上面这段程序若改用16位操作指令达到同样结果,怎么改?试修改并运行之。
4、BCD码加减法 CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE
5
ORG 4000H
SL: MOV AL,58H ADD AL,25H DAA JMP $ CODE ENDS END SL 5、标志位显示
在单步执行程序时,检查PSW标志寄存器值,其值为16进制,换成2进制查看相应位的值。 15 11 10 9 8 7 6 4 2 0 标志名
OF DF IF TF SF ZF AF PF CF PSW中标志位的符号表示:
标志为1 标志为0
OV DN EI NG ZR AC PE CY
NV UP DI PL NZ NA PO NC
OF 溢出 DF 方向 IF 中断 SF 符号 ZF 零 AF PF CF
奇偶 进位
(是/否) (减/增量) (负/正) (是/否) (偶/奇) (是/否)
(允许/关闭)
辅助进位(是/否)
6、内存操作数及各种寻址方式使用: CODE SEGMENT ASSUME ORG SL: MOV MOV
MOV MOV MOV INC MOV DEC MOV MOV MOV MOV
CS:CODE,DS:CODE,ES:CODE 5000H
AX,1234H
DS:[1000H],AX BX,1002H
BYTE PTR[BX],20H DL,39H BX
[BX],DL DL
SI,0003H [BX+SI],DL [BX+SI+1],DL
WORD PTR[BX+SI+2],2846H
$
JMP CODE ENDS
SL
END
注意:
用户程序区 用户数据区 0000:1000—7FFFH 0000:1000—7FFFH 由于实验装置的存储空间不超过64K,程序区和数据区都在(0000:1000—7FFFH)中,所以我们
6
必须通过偏移地址的不同加以区分。
在利用存储空间存放数据时,其偏移地址必须避开程序存放的偏移地址,在上面的程序中程序的
存放地址是从5000H开始的(ORG 5000H),那么程序中要保存AX值在内存单元中时就不能是5000H,我们将其放在了1000H中(MOV
DS:[1000H],AX)。
思考:有关指令中BYTE PTR及WORD PTR伪操作不加行不行?试一试。
7、求累加和程序:
从内存地址1000H开始依次键入16个字节数,利用程序求和
CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG
6000H BX,1000H CX,10H AX,AX AL,[BX] AH,0 BX LOP $ SL
SL: MOV
MOV SUB LOP: ADD
ADC
INC
LOOP JMP CODE ENDS
END
思考:上述程序求和的结果保存在哪?如要将结果保存在2000H应如何修改。
提示:程序执行后如结果保存在寄存器中不适宜用连续执行,利用单步执行执行到最后一句后查看寄存器内容。
8、多字节加法程序。
在1000H开始处键入一个8字节被加数,在2000H开始处键入一个8字节加数,均为低字节在前面。
CODE SEGMENT ASSUME CS:CODE,DS:CODE,ES:CODE ORG SL: MOV
MOV
MOV CLC LOP: MOV
ADC
INC INC
7000H DI,1000H CX,8 SI,2000H AL,[SI] [DI],AL SI DI
$
LOOP LOP
JMP
CODE ENDS END
9、自编程序: 实验步骤
写成完整的实验程序,用单步运行查看对应的寄存器和存储单元的变化。
SL
用16位减法指令编一个32位(4字节)数减法程序,两个源数及结果存放地址同上题。调试并做记录。
7
实验二 清零程序
实验目的
掌握8088汇编语言程序设计和调试方法,熟悉键盘操作。
实验内容
把RAM区内4000H-40FFH单元的内容清零 。
程序框图及程序
CODE
SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE ORG 3000H
SL:
MOV MOV MOV
LL:
MOV INC INC LOOP JMP
CODE
ENDS END SL
BX, 4000H AX, 0000H CX, 0080H [BX],AX BX BX LL $
;循环
实验步骤
用连续或单步方式运行程序,检查4000-40FFH内容执行程序前后的变化。
思考
假使把4000H-40FFH中的内容改成FF,如何修改程序; 如果把4000H-40FEH中的内容改成FF,如何修改程序; 试编写一到二种其它方法实现的清零程序。
8