AND AL, 50 MOD 4
OR AX, 0F00FH AND 1234 OR 00FFH 答:(1)将0066H 传送给AX (2)将0FFH 传送给AL (3)将0FFFFH 传送给AX (4)AND AL,02H (5)OR AX,00FFH 3. 有符号定义语句如下: BUF DB 3,4,5,?123? ABUF DB 0
L EQU ABUF-BUF 求L 的值为多少? 答:L=6
4. 假设程序中的数据定义如下: PAR DW ?
PNAME DB 16 DUP(?) COUNT DD ?
PLENTH EQU $-PAR
求PLENTH 的值为多少?表示什么意义?
答:PAR 的偏移地址为0,PLENTH 当前偏移地址$=2+16+4=22, $-PAR=22,故PLENTH 的值为22。
若在PLENTH 所在行有变量定义,则$表示该变量的偏移地址,即$表示PLENTH 所在 行的当前偏移地址。故PLENTH 表示从当前行到PAR 之间定义的变量所占的字节个数。
5. 对于下面的数据定义,各条MOV 指令执行后,有关寄存器的内容是什么? DA1 DB ?
DA2 DW 10 DUP(?) DA3 DB ?ABCD? MOV AX, TYPE DA1 MOV BX, SIZE DA2 MOV CX, LENGTH DA3 答:AX=1,BX=20,CX=1
6. 下段程序完成后,AH 等于什么? IN AL, 5FH TEST AL, 80H JZ L1
MOV AH, 0 JMP STOP
L1: MOV AH, 0FFH STOP: HLT
答:讨论从端口5FH 输入的数据最高位的情况。若最高位为
1,则AH=0;若最高位为0, 则AH=0FFH。
7. 编程序完成下列功能:
(1)利用中断调用产生5 秒延时。
(2)利用中断调用,在屏幕上显示1~9 之间随机数。 答:(1)可以利用中断类型1CH 来处理,因为在系统时钟的中断处理程序中,时钟中断一
次要调用一次INT 1CH,即每隔55ms,产生一次1CH 中断,要产生5 秒延时,只要中断
5s/55ms=91 次即可。又因1CH 中断处理程序中只有一条IRET 指令,故可将用户的程序代 替原有的INT 1CH 程序。 DATA SEGMENT
COUNT DW 91 ;计数器
MESS DB ?5 s delayed!?,0AH,0DH,?$? DATA ENDS
CODE SEGMENT MAIN PROC FAR
ASSUME CS:CODE,DS:DATA,ES:DATA START: PUSH DS MOV AX,0 PUSH AX
MOV AX,DATA MOV DS,AX
MOV AL,1CH ;得到原中断向量 MOV AH,35H INT 21H
PUSH ES ;存储原中断向量 PUSH BX PUSH DS
MOV DX,OFFSET DELAY ;DELAY 的偏移地址和段地址 MOV AX,SEG DELAY MOV DS,AX
MOV AL,1CH ;设置中断向量 MOV AH,25H INT 21H POP DS
IN AL,21H ;设置中断屏蔽位 AND AL,0FEH OUT 21H,AL STI
MOV DI,2000H ;主程序延迟,在执行此段程序期间 A1: MOV SI,3000H ;产生中断 A2: DEC SI
JNZ A2 DEC DI JNZ A1
POP DX ;取原中断向量 POP DS
MOV AL,1CH MOV AH,25H INT 21H RET
MAIN ENDP
DELAY PROC NEAR PUSH DS PUSH AX PUSH CX PUSH DX
MOV AX,DATA MOV DS,AX STI
DEC COUNT ;5 秒计数 JNZ EXIT
MOV DX,OFFSET MESS ;显示信息 MOV AH,09H INT 21H
MOV COUNT,91 ;5 秒的值 EXIT: CLI POP DX POP CX POP AX POP DS IRET
DELAY ENDP CODE ENDS END START (2)可以利用INT 1AH,读取当前时间的1/100 秒为随机数。CODE SEGMENT ASSUME CS:CODE START:MOV AH,0
INT 1AH ;读取当前时间CH:CL=时:分 MOV AL,DL ;DH:DL=秒:1/100 秒 MOV AH,0 MOV BL,9 DIV BL INC AH
MOV DL,AH
ADD DL,30H MOV AH,2 INT 21H
MOV AH,4CH INT 21H CODE ENDS END START
8. 编两个通过过程完成将AX 中存放的二进制数转换成压缩型BCD 码以及将BCD 码转换 成二进制数。 答:(1)将AX 中的二进制数先后除以1000,100 和10,每次除法所得的商,即是BCD 数
的千位、百位和十位数,余数是个位数。 子程序名:B2TOBCD
输入参数:AX=十六位二进制数
输出参数:CF=0,则AX=4 位压缩型BCD 码。CF=1,则要转换的数大于9999,AX 不 变。
使用寄存器:CX:存放除数,DX:存放中间结果。 B2TOBCD PROC FAR
CMP AX,9999 ;AX>9999,则CF 置1 JBE TRAN STC
JMP EXIT
TRAN: PUSH CX PUSH DX
SUB DX,DX ;DX 清0
MOV CX,1000 ;计算千位数 DIV CX
XCHG AX,DX ;商在DX 中,余数在AX 中 MOV CL,4
SHL DX,CL ;DX 左移4 位 MOV CL,100 ;计算百位数 DIV CL
ADD DL,AL ;百位数加到DL 中,DX 左移4 位 MOV CL,4 SHL DX,CL
XCHG AL,AH ;余数保留在AL 中 SUB AH,AH
MOV CL,10 ;计算十位数 DIV CL
ADD DL,AL ;十位数加到DL 中,DX 左移4 位 MOV CL,4 SHL DX,CL
ADD DL,AH ;加个位数
MOV AX,DX ;结果送到AX 中 POP DX POP CX EXIT: RET
B2TOBCD ENDP
(2)将AX 中4 位BCD 码顺序乘以1000,100,10 和1,然后求和即得。
子程序名:BCDTOB2
输入参数:AX=4 位压缩BCD 码 输出参数:AX=十六位二进制数
使用寄存器:BX:暂存数据,CX:存放乘数,DX:存放中间结果
BCDTOB2 PROC FAR PUSH BX PUSH CX PUSH DX MOV BX,AX MOV CL,4 ROL AX,CL AND AX,000FH
MOV CX,1000 ;乘以1000 MUL CX MOV DX,AX MOV AX,BX MOV CL,8 ROL AX,CL AND AX,000FH
MOV CL,100 ;乘以100 MUL CL ADD DX,AX MOV AX,BX MOV CL,4 SHR AX,CL AND AX,000FH
MOV CL,10 ;乘以10 MUL CL ADD DX,AX AND BX,000FH ADD DX,BX MOV AX,DX POP DX POP CX POP BX