MOV CL,4
SHL DX,CL ;(DX)=F080H MOV BL,AH
SHL BL,CL ;(BL)=20H SHR BL,CL ;(BL)=02H OR DL,BL ;(DL)=82H
【答】将DX 中的低4 位数据8H 分离出来,将AH 中的低4 位数据2H 分离出来,合并为82H 存放在DL。
4.4 已知程序段如下: MOV AX,1234H MOV CL,4 ROL AX,CL DEC AX MOV CX,4 MUL CX
试问:(1)每条指令执行后,AX 寄存器的内容是什么?(2)每条指令执行后,CF,SF 及ZF 的值分别是什么?(3)程序运行结束时,AX 及DX 寄存器的值为多少? 【答】MOV AX,1234H ; (AX)=1234H, CF=SF=ZF=0 MOV CL,4
ROL AX,CL ; (AX)=2341H ,CF=1,SF=ZF=0 DEC AX ; (AX)=2340H, CF=1,SF=ZF=0 MOV CX,4 ;
MUL CX ;(AX)= 8000H ,CF=ZF=0,SF=1,DX=0 4.5 试分析下列程序段: ADD AX,BX JNC L2
SUB AX,BX JNC L3
JMP SHORTL5
如果AX、BX 的内容给定如下: AX BX
(1)14C6H 80DCH (程序转向L2)
(2)B568H 54B7H (程序转向SHORTL5 )
问该程序在上述情况下执行后,程序转向何处? 【答】(1) 程序转向L2。(2) 程序转向SHORTL5。
4.6 以下为某个数据段,试问各个变量分别占多少字节,该数据段共占多少字节? DATA SEGMENT
VAR1 DW 9 ;2 字节
VAR2 DD 10 DUP(?),2 ;44 字节
VAR3 DB 2 DUP(?,10 DUP(?)) ;22 字节 14
VAR4 DB ‘HOW ARE YOU' ;11 字节 DATA ENDS
【答】该数据段共占79 字节。
4.7 下列语句在存储器中分别为变量分配多少字节空间?并画出存储空 间的分配图。
VAR1 DB 10,2 ;2 字节
VAR2 DW 5DUP(?),0 ;12 字节
VAR3 DB ‘HOW ARE YOU?',‘$' ;13 字节 VAR4 DD -1,1,0 ;12 字节
4.8 编写一段程序,比较两个5 字节的字符串OLDS 和NEWS,若相同,在 RESULT 置0,否则置0FFH。 【答】参考程序: OLDS DB 1,2,3,4,5 NEWS DB 1,2,3,4,5 RESULT DB ?
MOV SI,OFFSET OLDS MOV DI,OFFSET NEWS MOV CX,10 CLD
REP CMPSB
JNZ NOEQU ;串不相等转 MOV AL,0 JMP OUTPT
NOEQU: MOV AL,0FFH OUTPT: MOV RESULT,AL STOP: JMP STOP
4.9 编程求和Y=A1 + A2 + ?. + A100 【答】
DATA SEGMENT
TABLE DW 12,3,45,.. YAL DW ? YAH DW ? DATA ENDS ???
MIAN PROC FAR PUSH DS MOV AX, 0 PUSH AX
MOV AX, DATA MOV DS, AX MOV DX,0
XOR AX, AX ;清AX MOV BX, OFFSET TABLE 15
MOV CX, 4 CLC
LP: ADD AX, [BX] ;求和
。其中Ai 为字节变量。
JNC DON INC DX CLC
DON: INC BX
INC BX ;指向下一个数 LOOP LP ;未加完,继续 MOV YAL,AX ;存和 MOV YAH,DX MAIN ENDP CODE ENDS END START
4.10 内存中以FIRST 和SECOND 开始的单元中分别存放着两个16 位组合的十进制(BCD 码) 数,低位在前。编程序求这两个数的组合的十进制和,并存到以THIRD 开始的单元。 【答】参考程序:1325+9839=? DATA SEGMENT
FIRST DB 05H,02H,03H,01H ; SECOND DB 09H,03H, 08H,09H; THIRD DB 20 DUP (?) DATA ENDS
STACK SEGMENT
ST1 DB 100 DUP (‘SA’) TOP1 EQU LENGTH ST1 STACK ENDS CODE SEGMENT
ASUMME CS:CODE,DS:DATA,SS:STACK MAIN PROC FAR
START: MOV AX, DAT ;初始化数据段 MOV DS, AX
MOV AX, STACK ;初始化堆栈段 MOV SS, AX MOV AX, TOP1 MOV SP, AX
MOV CX, 4 ;计算4 次
MOV SI , OFFSET DAT2 ;取数据地址 MOV DI , OFFSET SUM ;取结果地址 MOV AH, 00H ;将暂存标志的AH 清0 DON1: MOV AL, [BX] ;取第一个数 SAHF ;将AH 中的标志送标志寄存器 ADC AL, [DI] ;与第二个数带进位加 AAA ;十进制校正
LAHF ;将标志寄存器内容送AH OR AL, 30H ;计算值拼成ASCII 码 MOV [DI], AL ;存结果的ASCII 码 16
INC BX ;指向第一个数的下一位 INC SI ;指向第二个数的下一位 INC DI ;指向结果单元的下一位 LOOP DON1 ;未计算完,继续
AND AH, 01H ;将最高位的进位标志送AH OR AH, 30H ;最高位的进位位拼成ASCII 码 MOV [DI], AH ;存结果的最高位
MOV AH, 02H ;调用DOS 的02H 功能显示 MOV CX, 05H ;显示数据的位数 DON2: MOV DL,[DI] ;显示数据送DL INT 21H ;显示
DEC DI ;显示数据所在存储单元加一 LOOP DON2 ;未显示完,继续 MOV AH, 4CH ;返回DOS INT 21H RET
MAIN ENDP CODE ENDS END START
4.11 试编程序,统计由40000H 开始的16K 个单元中所存放的字符“A“的个数,并将结果 存放在DX 中。 【答】参考程序 DATA SEGMENT
DATA1 DB 'DFASFAAAFDFAAFFFA' COUNT EQU $-DATA1 DATA ENDS
STACK SEGMENT
STA DB 100 DUP (?) TOP EQU LENGTH STA STACK ENDS CODE SEGMENT
ASSUME CS:CODE,DS:DATA,SS:STACK BEGIN: MOV AX,DATA MOV DS,AX MOV AX,STACK MOV SS,AX MOV AX,TOP MOV SP,AX MOV CX,COUNT MOV DX,0
LEA SI,DATA1 MOV BL,'A'
NEXT : CMP [SI],BL JNZ OTHER
INC DX
OTHER: INC SI 17
LOOP NEXT CODE ENDS END BEGIN
4.12 统计数据块中正数与负数的个数,并将正数与负数分别送到两个缓冲区。 【答】
BLOCK DB -1,-3,5,6,-2,0,20,10 PLUS_D DB 8 DUP(?) ;正数缓冲区 MINUS_D DB 8 DUP(?) ;负数缓冲区 PLUS DB 0 MINUS DB 0
MOV SI,OFFSET BLOCK MOV DI,OFFSET PLUS_D MOV BX,OFFSET MINUS_D MOV CX, 8 ;数据个数送X GOON: LODSB ;AL← [SI] TEST AX, 80H
JNZ JMIUS ;为负数,转 INC PLUS ;正数个数加一 STOSB ;[DI] ←AL,传正数 JMP AGAIN
JMIUS: INC MINUS ;负数个数加一 XCHG BX, DI
STOSB ;送负数到缓冲区 XCHG BX, DI AGAIN: DEC CX JNZ GOON
4.13 编写一个子程序将AX 中的十六进制数,转换成ASCII 码, 存于ADR 开始的四个单元中。 提示:1)、AX 中的数从左到右,转换成ASCII 码,用循环左移ROL 和AND 指令,把提出的一 个十六进制数置BL 中;
2)、0 ~ 9 的ASCII 码:30 ~ 39H,A ~ F 的ASCII 码:41H ~ 46H。
( 先把每个数加30H,判断是否为数字0 ~ 9?若是A ~ F,再加07H,得字母的ASCII 码。) 【答】参考程序: DATA SEGMENT ADR DB 4 DUP(?) DATA ENDS CODE SEGMENT MAIN PROC FAR
ASSUME CS:CODE,DS:DATA
START: MOV AX,7EC3H ;假设ax 中存放7ec3h LEA SI,ADR MOV DL,4