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小时内删除。