3.1
MOV AX ,00H ; 立即寻址
SUB AX ,AX ; 寄存器寻址
MOV AX ,[BX]; 寄存器间接寻址
MOV AX ,TABLE ; 直接寻址
MOV AL ,ARAY1[SI]; 寄存器相对寻址
MOV AX ,[BX+6]; 寄存器相对寻址
3.2 若1KB 的数据存放在TABLE 以下,试编写程序将该数据拌到NEXT 之下。
程序片段如下:
ORG 100h
MOV CX,03FFH ;数据个数
LEA SI,TABLE ;源区首地址
LEA DI,NEXT ; 目的区首地址
AGAIN: MOV AL,[SI];
MOV [DI],AL; 搬移
INC SI
INC DI ; 移动地址指针
DEC CX ; 循环计数器递减
JNZ AGAIN ; 循环未结束转
HLT ; 暂停
TABLE DB 1024 dup ('A'); 源数据区
NEXT DB 1024 dup (0); 目的数据区
3.3 编写10个字(16位二进制数)之和的程序
ORG 100h
LEA SI,ADD1;
LEA DI,ADD2;
LEA BX,SUM;
MOV CL,CONT;
MOV CH,0; 循环初始化
CLC ; 进位清零
MADD1: MOV AX,[SI]; 读加数1
ADC AX,[DI]
ADD SI,2; 移动源区地址指针
ADD DI,2; 移动目的区地址指针
MOV [BX],AX; 回存计算结果
ADD BX,2; 移动“和”存储区地址指针
LOOP MADD1; 循环控制
HLT ; 暂停
ADD1 DB 0FEH,86H,7CH,44h,56H,1FH ,24H ,01H ,02H ,33H ;加数1
ADD2 DB 56H,49H,4EH,0FH,9CH,22H ,45H ,11H ,45H ,21H ; 加数2
SUM DB 10 DUP (0); 和存储单元
CONT DB 5 ; 循环次数
3.4 某16位二进制数,放在DA TA 连续的两个单元中,试编程求其平方根和余数,将其分
别存放在ANS 和REMAIN 中。
ORG 100h
MOV BL,2; 除数初值
AGAIN: MOV CX,NUM; 预计最大循环次数
MOV AL,BL; 0、1的平方根除外
MUL BL; 得到2的平方
CMP AX,CX; 大于原始数据么?
JG EXIT; 若原始数据小于4转EXIT
MOV AX,CX; 读数
DIV BL; 试除
INC BL; 除数递增
JMP AGAIN; 继续除
EXIT: DEC BL; 去除除数自加
MOV ANS,BL; 存商
MOV AL,BL; 恢复余数
MUL BL;
SUB CX,AX;
MOV REMAIN,CL;
HLT
NUM DW 7;
ANS DB ?;
REMAIN DB ?;
3.5 在DATA1之下顺序存放着以ASCII 码表示的千位数,将其转换成二进制数。
MOV CL,4; 移位次数
MOV CH,CL; 循环次数
MOV SI,OFFSET ASCBIN
CLD
XOR AX,AX
XOR DX,DX
ASCB1: LODSB
AND AL,7FH
CMP AL,'0' ; 不大于„0‟结束转换
JL ERR
CMP AL,'9'
JG ASCB2 ; 大于„9‟转ASCB2
SUB AL,30H ; 数字形式二进制数减30H
JMP ASCB3
ASCB2: CMP AL,'A' ; 大于„9‟又小于„A‟结束转换
JL ERR
CMP AL,'F'
JG ERR ; 大于„F‟为不合理数,结束转换
SUB AL,37H ; 字符形式ASCII 数减37H
ASCB3: OR DL,AL
ROL DX,CL
DEC CH
JNZ ASCB1
ROL DX,CL
MOV BIN,DX ;存储转换结果
ERR: NOP
HLT
ASCBIN DB '1','B,'4','3'
BIN DW ?
3.7 编写程序将MOLT 中的一个8位数乘以20,乘积放在ANS 中(用3种方式)。
解:第一种方法:常规乘法运算
ORG 100h
MOV AL,MOLT
MOV BL,20
MUL BL
MOV ANS,AX
HLT
MOLT DB 2
ANS DW ?
第二种方法,将MOLT 连加20次
ORG 100h
MOV CX,20
MOV BX,MOLT
XOR AX,AX
CLC
ADD1:ADC AX,BX
LOOP ADD1
MOV ANS,AX
HLT
MOLT DW 5
ANS DW ?
第三种方法,将“20”连加MOLT 次
ORG 100h
MOV CX,MOLT
MOV BX,20
XOR AX,AX
CLC
ADD1:ADC AX,BX
LOOP ADD1
MOV ANS,AX
HLT
MOLT DW 5
ANS DW ?
3.8 在DATA 之下存放100个无符号的8位数,找出其最大者并将其存放
在KVFF 单元。
ORG 100h
XOR DL,DL
LEA DI,KVFF;
NEXT0: LEA SI,BUFFER;
MOV CL,99; 比较次数为N-1次 NEXT1: MOV AL,[SI];
INC SI;
CMP DL,AL;
JNC NEXT2;
MOV DL,AL; DL 中始终存目前最大值
NEXT2: DEC CL;
JNZ NEXT1;
MOV [DI],DL; 最大值存储
HLT
BUFFER DB ;自行定义100个数据
KVFF DB ?
3.9 若将数据按大小顺序排序, 试编写程序..
解:此处采用 “冒泡法”予以处理:
ORG 100h
LEA DI,BUFFER; 数据区 MOV BL,99; 外循环次数 NEXT0: MOV SI,DI;
MOV CL,BL; 内循环次数
NEXT3: MOV AL,[SI]; 读数
INC SI; 移动指针
CMP AL,[SI]; 比较
JNC NEXT5; 大于转NEXT5
MOV DL,[SI];
MOV [SI-1],DL;
MOV [SI],AL; 不大于互换 NEXT5: DEC CL; 内循环次数减一
JNZ NEXT3; DEC BL; 外循环次数减一 JNZ NEXT0
HLT
BUFFER DB 自行定义100个字节型数据
3.10 在BVFF 单元中有一个BCD 数A, 试根据下列关系编写程序, 计算结果存在DES 中. A=60,Y=80.
ORG 100h
MOV AL,BVFF
CMP AL,20
JL EX1
CMP AL,60
JL EX2
MOV AL,80
JMP STOP
EX1: MOV BL,3
MUL BL
JMP STOP
EX2: SUB AL,20
STOP: MOV DES,AL
HLT
BVFF DB 8
DES DB ?
3.11址为DATAB 开始的80个单元中, 存放某班80个学生的某课程成绩, 要求:
统计>=90分、80~89分、70~79分、60~69分、60分以下的人数,结果存放在BTRX 开始的5个单元中
求平均成绩,结果存放在LEVEL 中。
解:寄存器使用分配:90分以上在DH ,80分以上在DL ,70分以上在BH ,60分以上在BL ,60分以下在AH ,总分、均分都在[DI]。
ORG 100h
XOR AH,AH
XOR DX,DX ; 统计结果清零
XOR BX,BX ; 统计结果清零
LEA SI,DATA
LEA DI,LEVEL
MOV CL,CONT; 总人数送循环计数器 CX
goon: MOV AL,[SI] ; 读原始数据
ADC [DI], AL; 累加总分
ADC [DI+1],0 ; 计算进位
CMP AL,90
JL PP8 ; 不高于90分者转PP8
INC DH ; 90--100分的人数加一
JMP STOR
PP8: CMP AL,80
JL PP7 ; 不高于80分转PP7
INC DL ;80----89分的人数加一
JMP STOR
PP7: CMP AL,70
JL PP6 ; 不高于70分者转PP6
INC BH ;70---79分的人数加一
JMP STOR
PP6: CMP AL,60
JL PP5 ; 不高于60分者转PP5
INC BL ;60---69分的人数加一
JMP STOR
PP5: INC AH ; 低于60分的人数加一 STOR: INC SI ; 读下一个分数
LOOP GOON
;CX=CX-1,CX不为零转GOON, 继续统计
LEA SI,BUFFER ; 回存统计结果
MOV [SI],DH
INC SI
MOV [SI],DL
INC SI
MOV [SI],BH
INC SI
MOV [SI],BL
INC SI
MOV [SI],AH
MOV AX,WORD PTR [DI] ; 计算平均成绩
MOV CL,CONT
DIV CL
MOV LEVEL,AL ; 回存平均成绩
HLT
CONT DB 10
DATA DB 30,65,99,80,75, 89,100,45,60,70
BUFFER DB ?,?,?,?,?
LEVEL DB ? ,?
3.12 求两个有符号数(DATA1,DATA2)差的绝对值, 结果存入DATA3.
ORG 100h
MOV AL,DATA1;读入被减数
SUB AL,DATA2;减去减数
JC CHANGE ;
JMP STOR
CHANGE: NEG AL
STOR: MOV DA TA3,AL
HLT
DATA1 DB 3
DATA2 DB 5
DATA3 DB ?
3.13 存从40000H 到4BFFH 的个单元均写入55H, 并再逐个读出, 验证是否一致, 若一致, 置AL 为7EH, 否则置AL 为81H.
ORG 100h
MOV AX,4000H;
MOV DS,AX;
MOV SI,0
START: MOV CX,0BFFFH
BEGIN: MOV [SI],55H
MOV AL,[SI]
INC SI
CMP AL,55H
JNZ ERR
LOOP BEGIN
MOV AL,7EH
JMP STOP
ERR: MOV AL,81H
STOP: HLT
3.14~3.15 端口03FBH 的BIT5为状态标志, 当该位为1时, 表示外设忙, 不能接收数据; 当为0时, 表示外设闲, 可以接收数据; 当CPU 向端口03F8H 写入一个字节的数据时,03FBH 的BIT5置1, 当它变为0状态时, 又可以写入下一个数据。据此编写将起始地址为SEDA T 的50个数据输出到03F8H 端口的程序。
W AIT : MOV DX ,03FBH
IN AL ,DX
TEST AL ,0010 0000B;(20H )
JZ SEND
JMP W AIT
SEND : MOV DX ,3F8H
MOV AL ,[SI];
CMP AL ,0AH ;输出字串结束标志符 JZ STOP
OUT DX ,AL
JMP W AIT
STOP :HLT
3.16 口02E0H 的BIT2和BIT5同时为1,表示端口02E7H 有一个字节型数据准备好可以用以输入,当CPU 从该端口读入数据后,02E0端口的BIT2和BIT5就不再同时为1;只有当02E7H 端口的数据再次准备好时,它们才会再次同时为1,据此编写从02E7H 端口输入32个数据然后存入A1000H 单元开始的区域。
MOV AX ,0A000H
MOV DS ,AX
MOV SI ,1000H ; 设置存储区地址 MOV CL ,20H ; 输入数据个数
BEGIN : MOV DX ,0E20H
IN AL ,DX
TEST AL ,0010 0100B; 测试状态位 BIT5、BIT2 JZ BEGIN ; 不同时为1继续测试 MOV DX ,02E7H
IN AL ,DX ; 输入数据
MOV [SI],AL ; 存到指定区域 INC SI ; 移动地址指针 LOOP BEGIN ; 循环
HLT
3.17 在内存40000H 开始的16K 的单元中存放着一组数据,将其顺序搬移到起始地址为A0000H 的区域。
解:利用字符串操作指令 MOVSB ,16K 即16*1024=3FFFH。
MOV AX ,4000H
MOV DS ,AX
MOV AX ,A000H
MOV ES ,AX
MOV SI ,0
MOV DI ,0
MOV CX ,3FFFH
CLD
REP MOVSB
HLT
3.18 上题的基础上,将两个区域的数据逐个进行比较,若有错将BL 置0,全对将BL 置FFH 。
MOV AX ,4000H
MOV DS ,AX
MOV AX ,A000H
MOV ES ,AX
MOV SI ,0
MOV DI ,0
MOV CX ,03FFH
CLD
AAB : CMPSB
JNZ STOP
LOOP AAB
MOV BL ,0FFH
JMP EX1
STOP : MOV BL ,0;
EX1: NOP
HLT
3.19 统计由40000H 单元开始的16K 个单元中所存字符„A‟的个数,统计结果存放在DX 寄存器中。
MOV AX ,4000H
MOV DS ,AX
MOV SI ,0;
MOV CX ,3FFFH ; 数据个数
MOV DX ,0;统计结果寄存器清零 XOR DX,DX CLD
AAB : LODSB
CMP AL ,„A‟; 比较
JZ AAC ;字符为„A‟转计数
LOOP AAB ; 循环
JMP STOP ; 处理完毕转结束
AAC : INC DX ; 统计结果加1
DEC CX ; 循环次数减1
JCXNZ AAB ; CX0继续
STOP : HLT
3.20 编写对AL 中的数据进行“偶校验”的一个过程,并将校验结果放入AL 寄存器。
PJY PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
MOV AL ,DAT
AND AL ,AL
JNP PJY1
MOV AL ,00H ; 表示为偶 JMP EXIT
PJY1: MOV AL ,FFH ; 表示为奇
EXIT : POP DX
POP CX
POP BX
POP AX
RET
PJY NDP
DAT DB ?
3.21 对80000H 开始的256个单元的数据加上偶校验。
ORG 100h
MOV AX ,8000H
MOV DS ,AX
MOV SI,0
MOV CX,100H
CLD
PAR0: LODSB ;(MOV AL ,[SI] ;INC SI )
PAR1:
STOP:
TEST AL,AL JNP PAR1 LOOP PAR0 JMP STOP OR AL,80H; MOV [SI-1],AL DEC CX JNZ PAR0 HLT