汇编语言程序设计(合工大版)习题参考答案 下载本文

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