1、例编写程序,计算75÷6=l 2 (3)
解:该除法运算过程表示如下:(注:75以BCD码的形式存放)
第一个商为1→ 1 2 ← 第二个商为2
6/ 7 5
- 6
-----------------
第一个余数为1→ 1 5
- 1 2
-----------------
3 ← 第二个余数为3
程序如下:
FIRST DB 06H ;除数6
SECOND DB 75H ;被除数75H
THIRD DB 2 DUP(0);存商
FOUR DB ?;存余数
………
MOV AH,00H ;第一个被除数高位AH清0
MOV AL,SECOND ;AL 被除数75
AND AL,0F0H ;截取高4位
MOV CL,04H
ROL AL,CL ;移至低4位
DIV FIRST ;AX/06,即0007/06;
;
得结果:AL商为1,AH余数1
MOV THIRD+1,AL ;结果单元第一个商1
MOV AL,SECOND ;AL被除数75
AND AL,0FH ;AL截低4位,故AX=0105H
AAD ;将AX中内容0105H调整为0FH
DIV FIRST ;0FH/6,结果:AL商为2,AH余数3 MOV THIRD,AL ;THIRD单元第二个商2
MOV FOUR,AH ;FOUR单元第二个余数3
2、例设AL寄存器中存有报警标志。若D7=1,表示温度报警,程序要转到温度报警处理程序T_ ALARM;D6=1,则转压力报警程序
P_ALARM。用TEST指令来实现这种功能。
解:TEST AL,80H ;查AL的D7=1?
JNZ T_ALARM ;是1(非零),则转温度报警程序
TEST AL,40H ;D7=0,D6=1?
JNZ P_ALARM ;是1,转压力报警
(其中:JNZ为条件转移指令,表示结果非0 (ZF=1)则转移)3、例要求把数据段中以SRC_MESS为偏移地址的一串字
符“HELLO!”,传送到附加段中以NEW_LOC开始的单元中。
解:DATA SEGMENT ;数据段
SRC_MESS DB ‘HELLO!’ ;源串
DATA ENDS
;
EXTRA SEGMENT ;附加段
NEW_LOC DB 6 DUP(?) ;存放目的串
EXTRA ENDS
;
CODE SEGMENT
ASSUME CS:CD, DS:DATA, ES:EXTRA START: MOV AX,DATA
MOV DS,AX ;DS=数据段段址
MOV AX,EXTRA
MOV ES,AX ;ES=附加段段址
LEA SI,SRC_MESS ;SI指向源串偏移地址
LEA DI,NEW_LOC ;DI指向目的串偏移地址
MOV CX,6 ;CX作串长度计数器
CLD ;清方向标志,地址增量
字符串长度17模式串长度
REP MOVSB ;重复传送串中各字节,直到CX=0
其中“REP MOVSB”指令可用以下几条指令代替:
AGAIN: MOVS NEW_LOC, SRC_MESS
DEC CX
JNZ AGAIN
4、例比较两个字符串,一个是程序中设定的口令串PASSWORD,另一个是从键盘输入的字符串IN_WORD,若输入串与口令串相同,程序将开始执行。否则,程序驱动PC机的扬声器发声,警告用户口令不符,拒绝往下执行。
解:这可以用CMPS指令来实现,有关程序段如下:
DATA SEGMENT ;数据段
PASSWORD DB ‘750424LI’ ;口令串
IN_WORD DB ‘750424LE’ ;从键盘输入的串
COUNT EQU 8 ;串长度
DATA ENDS
……
CODE SEGMENT ;代码段
……
LEA SI, PASSWORD ;源串指针
LEA DI, IN_WORD ;目的串指针
MOV CX, COUNT ;串长度
CLD ;地址增量
REPZ CMPSB ;CX≠0且串相等时重复比较
JNE SOUND ;若不相等,转发声程序
OK: …… ;比完且相等,往下执行
……
SOUND: …… ;使PC机扬声器发声
…… ;并退出
CODE ENDS
5、例在某一字符串中搜寻是否有字符A,若有,则把搜索次数记下来,送到BX寄存器中,若没有查到,则将BX寄存器清0。设字符串起始地址STRING的偏移地址为0,字符串长度为CX。
解: MOV DI,OFFSET STRING ;DI=字符串偏移地址
MOV CX,COUNT ;CX=字符串长度
MOV AL,‘A’ ;AL=关键字A的A5CII码
CLD ;清标志方向
REPNE SCASB ;CX≠0(没查完)和ZF=0(不相等)时重复
JZ FIND ;若ZF=1,表示已搜到,转出
MOV DI,0 ;若ZF=0,表示没搜到,DI 0 FIND:MOV BX,DI ;BX搜索次数
HLT
说明:
DI初值存起始地址偏移量0,搜索一次后,DI自动加1,使DI的值等于1;
每执行一次搜索操作,DI自动增1;
因此可用DI的值表示搜索次数。
6、例若在数据段中有一个数据块,起始地址为BLOCK,数据块中的数为8位带符号数,要求将其中所含的正、负数分开,然后把正数送
到附加段中始址为PLUS_DATA的缓冲区,负数则送到附加段中始址为MINUS_DATA的缓冲区。
分析:
把数据块作为数据串处理:
用SI作源串指针;
DI和BX分别作正、负数目的缓冲区的指针;
CX用于控制循环次数。
技巧:
使用STOSB指令必须以SI为源指针,DI为目的指针;
负数区的目的指针在BX中,要用XCHG指令将BX内容送进DI,让DI指向负数区,同时也把DI中的正数区目的指针保护了起来;
执行STOSB指令后,再用XCHG指令交换回来,以便下次重复执行时(转回GOON标号后),LODS指令仍能正确执行。
解:写出如下程序段:
START: MOV SI, OFFSET BLOCK ;SI为源串指针MOV DI, OFFSET PLUS_DATA ;DI为正数目的区指针
MOV BX, OFFSET MINUS_DATA ;BX为负数目的区指针
MOV CX, COUNT ;CX放循环次数
CLD
GOON: LODSB BLOCK ;AL←源操作数的一个字节TEST AL, 80H ;是负数?
JNZ MINUS ;是,转MINUS
STOSB ;非负数,将字节送正数区
JMP AGAIN ;处理下一个字节
MINUS: XCHG BX, DI ;交换正负数指针
STOSB ;负数送入负数区
XCHG BX, DI ;回复正负数指针
AGAIN: DEC CX ;次数减1
JNZ GOON ;未处理完,继续传送
HLT ;停机
7、例设某个学生的英语成绩已存放在AL寄存器中,若低于60分,则打印F(FAIL);若高于或等于85分,则打印G(GOOD);当在60分和84分之间时,打印P(PASS)。
解:用下面程序实现要求的操作。
程序:
CMP AL,60 ;与60分比较
JB FAIL ;<60,转FAIL
CMP AL,85 ;≥60,与85分比较
JAE GOOD ;≥85,转GOOD
MOV AL,’P’ ;其它,将AL←’P’
JMP PRINT ;转打印程序
FAIL: MOV AL,’F’ ; AL←’F’
JMP PRINT ;转打印程序
GOOD: MOV AL,’G’ ; AL←’G’
PRINT: … ;打印存在AL中的字符
8、例假设某温度控制系统中,从温度传感器输入一个8位二进制的摄氏温度值。当系统中温度低于100度时,则打开加热器;当温度上升到100度或100度以上时,关闭加热器,进行下一步处理。设温度传感器的端口号为320H,同时假设控制加热器的输出信号连到端口321H的最低有效位,当将这一位置1时,加热器便打开,清0时则关闭加热器。解:实现上述温度控制的程序如下:
程序:
GET_TEMP: MOV DX,320H ;DX指向温度输入端口 IN AL,DX ;读取温度值
CMP AL,100 ;与100度比较
JB HEAT _ON ;<100度,加热
JMP HEAT _OFF ;≥ 100度,停止加热
HEAT _ON: MOV AL,01H ;D0位置1,加热
MOV DX,321H ;加热器口地址
OUT DX,AL ;打开加热器
JMP GET_TEMP ;继续检测温度
HEAT _OFF: MOV AL,00H ;D0位置0,停止加热 MOV DX,321H
OUT DX,AL ;关闭加热器
… ;进行其他处理
9、例设商店里有8种商品,价格分别为83元,76元,65元,84元,7l 元,49元,62元和58元,现要将每种商品提价7元,编程计算每种商品提价后的价格。
解:加法问题:将商品的原价按BCD码的形式,依次存放在标号为OLD开始的8个存储单元中,而新的价格存放进NEW开始的8个单元,然后用LOOP指令来实现8次循环。即
程序清单:
OLD DB 83H,76H,65H,84H
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论