code ends
end start
1E,00,00,00,20,00,00,64
3.13 在DEBUG下设置(SP)=20H,设置AX、BX、CX、DX为不同值,把这四个寄存器内容依次压入堆栈,再从堆栈中依次弹出到SI、DI、BP、BX寄存器。写出一段程序实现上述操作,并画出每条入栈指令执行后SP和堆栈中数据的变化。
3.14 求出7450H与以下各十六进制数的和及差,并根据结果标出SF、ZF、CF、OF标志位的值。
(1) 1234H (2)5678H (3)9804H
(4)E0A0H
SF、ZF、CF、OF (1)1234H+7450H, 1 0 0 1 (2)5678H+7450H, 1 0 0 1 (3)9804H+7450H, 0 0 1 0 (4)E0A0H+7450H, 0 0 1 0 3.15 在数据段有如下定义: DATAX DW ?,? DATAY DW ?,?
SUM DW ?,?,?,?
请用16位指令按下列要求写出指令序列:
(1)DATAX和DATAY两个字数据相加,和存放在SUM中。 MOV AX,DATAX ADD AX,DATAY MOV SUM AX
(2)DATAX和DATAY两个双字数据相加,和存放在SUM开始的字单元中。 MOV AX,DATAX MOV DX,DATAX+2 ADD AX,DATAY ADC DX,DATAY+2 MOV SUM,AX MOV SUM+2,DX
(3)DATAX和DATAY两个字数据相乘(用MUL),积存放在SUM开始的字单
元中。
(4)DATAX和DATAY两个双字数据相乘(用MUL),积存放在SUM开始的字单元中。
(5)DATAX双字除以字DATAY(用DIV),商和余数存放在SUM开始的字单元中。
(6)DATAX和DATAY两个压缩BCD码数据相加,和存放在SUM中。 3.16 双字长数X存放在DX和AX中,设(DX)=1004H,(AX)=1002H,要求用16位指令写出:
(1) 对存放在DX和AX中的双字长数求补的指令序列,并验证结果。 NOT AX
NOT DX ADD AX,1 ADC DX,0
(2) 用减法指令求0-X的指令序列,并验证结果。 MOV BX,0 MOV CX,0 SUB BX,AX
SBB CX,DX ;结果在CX,BX
3.17试编写一个程序求出双字长数的绝对值。双字长数在A开始的字单元中,结果存放在B开始的字单元中。
A DW ?,? B DW ?,? 。。。
MOV AX,A MOV DX,A+2 TEST DX,8000H JZ ZS NOT AX NOT DX ADD AX,1 ADC DX,0 ZS:MOV B,AX
MOV B+2,DX
3.18 用移位指令为主实现对AX中的无符号数乘以5,不考虑乘积可能超出16位。
MOV DX,AX
MOV CL,2 SHL AX,CL ADD AX,DX
3.19 用移位指令为主实现对AX中的无符号数乘以5,考虑乘积可能超出16位的情况。
提示:用DX接AX左移的位,32位操作。
3.20 把AX中的内容依次倒排序,即第0位移到第15位,第1位移到第14位,…。
3.21 在数据段有如下定义:
BUFF DB ‘ABCD$EFGHIJK$’
STR1 DB 12 DUP(?) LEN DB ?
用串指令编写程序完成以下操作: (1) 对字符串STR1全部置空格符。 MOV AX,DATA
MOV DS,AX MOV AL,20H LEA DI,STR1
MOV CX,STR1-BUFF CLD
REP STOSB
(2) 从左到右把BUFF中的字符串传送到STR1。 MOV AX,DATA MOV DS,AX MOV ES,AX CLD
LEA SI,BUFF LEA DI,STR1
MOV CX,STR1-BUFF REP MOVSB
(3) 从右到左把BUFF中的字符串传送到STR1。 MOV AX,DATA MOV DS,AX MOV ES,AX STD
LEA SI,STR1-1 LEA DI,LEN-1 MOV CX,STR1-BUFF REP MOVSB
(4) 比较BUFF与STR1两个字符串是否相等,如相等则DX=1,否则DX=0。 MOV AX,DATA MOV DS,AX MOV ES,AX CLD
LEA SI,BUFF LEA DI,STR1
MOV CX,STR1-BUFF REPE CMPSB
(5) 查找BUFF中有无字符$,把字符$出现的次数计入BX寄存器。 MOV AX,DATA MOV ES,AX MOV BX,0 CLD
MOV AL,‘$’ LEA SI,BUFF
MOV CX,STR1-BUFF NEXT: REPNE SCASB
JCXZ NO-FOUND INC BX JMP NEXT
3.22 对于给定的AX和BX的值,执行下列程序段,程序将转向哪里?
ADD AX, BX
JNO L1
JNC L2 SUB AX,BX JNC L3 JNO L4 JMP L5
(1) AX=1234H, BX=6789H (2) AX=9200H, BX=4000H (3) AX=420EH, BX=8031H (4) AX=E002H, BX=8086H L1,L1,L1,L5
3.23 下面不完整的程序段是比较AX和BX的值,把其中大的数送MAX变量。如果是无符号数,应如何填写指令?如果是有符号数,应如何填写指令?
CMP AX,BX
( JB L1 ) 有符号数:JL L1 MOV MAX,AX
( JMP L2 ) L1:MOV MAX,BX L2:HLT
3.24 在下列程序段的括号中分别填入如下指令,程序执行完后,AX、CX的内容是什么?
(1) LOOP (2) LOOPE (3) LOOPNZ MOV AX, 8
MOV CX,5 L1:SHL AX,CL
( )
提示:上机,SHL指令使ZF=0,LOOPE指令不可能循环。
3.25 测试AL寄存器,如果最高位和最低位同时为0,则转L0,如果最高位和最低位只有一位为1,则转L1,如果最高位和最低位同时为1,则转L2。画出流程图,并编写程序段。
ROL AL,1 AND AL,3 JZ L0 SUB AL,3 JZ L3 JMP L2