《汇编语言程序设计教程》人民邮电出版社第二版习题及参考答案第一章至第五章

网上的答案是第一版的,重新整理了一下

《汇编语言程序设计教程》人民邮电出版社第二版
刘慧婷,王庆生 主编
习题及参考答案

第六章至第十章请参考:http://www.omegaxyz.com/2017/05/17/assemblyans6_10/

第一章至第五章

核对及编辑:xyjigsaw

习题1
1.1 什么是机器语言?什么是汇编语言?简述汇编语言的特点。
机器语言就是用二进制编码组成的机器指令的集合和一组使用机器指令的规则。汇编语言是对机器指令中的操作码用英文单词的缩写描述,对操作数用标号、变量、常量描述。
汇编语言的特点:
(1)与机器有关:移植性差,但可直接控制硬件。
(2)程序效率高。
(3)局限性:受指令的限制,如考虑存储单元等。
(4)调试困难。

1.2 汇编程序与汇编源程序的区别是什么?
汇编源程序是指用汇编语言编写的程序,而汇编程序特指将汇编源程序汇编成目标文件的编译程序。
1.3 把下列十进制数转换为二进制数和十六进制数。
(1)67 (2)34 (3)254 (4)123
答:(1)1000011,43 (2)100010, 22
(3)1111 1110,FE (4)111 1011,7B

1.4 把下列二进制数转换为十六进制数和十进制数。
(1)01101101 (2)10110010 (3)111111
答:(1)6D,109 (2)B2,178, (3)3F,63

1.5 作下列十六进制数的运算,并转换为十进制数校核。
(1)5A+64 (2)86-49 (3)123-9A (4)43×2B
答:(1) BE (2)3D (3) 89 (4) B41

1.6 根据补码定义把下列十进制数表示为8位二进制补码。
(1) 64 (2) -24
答:(1)0100 0000 (2)[10011000]原=[1110 1000]补

1.7 下列各数均为十进制数,请采用8位二进制补码运算,并回答标志寄存器FLAGS中CF和OF的值,运算结果所代表的十进制数是多少?如果用16位二进制补码运算,其结果所代表的十进制数是多少?FLAGS中CF和OF的值呢?
(1)85+69 (2)85+(-69) (3)85-(-69) (4)85-(69)
答:85=55H,69=45H,-69=BBH,
8位二进制补码运算:
(1)85+69 =55H+45H=9AH=154, CF=0,OF=1
(2)85+(-69)=55H+BBH=10H=16,CF=1,OF=0
(3)85-(-69)=55H-BBH=9AH=154,CF=1,OF=1
(4)85-(69)=55H-45H=10H=16,CF=0,OF=0

16位二进制补码运算:
85=0055H,69=0045H,-69=0FFBBH,
(1)85+69 =0055H+0045H=009AH=154, CF=0,OF=0
(2)85+(-69)=0055H+0FFBBH=0010H=16,CF=1,OF=0
(3)85-(-69)=0055H-0FFBBH=009AH=154,CF=1,OF=0
(4)85-(69)=0055H-0045H=0010H=16,CF=0,OF=0

2.1 简述计算机系统组成。
答:计算机由中央处理器CPU,存储器,输入系统,输出系统组成,由系统总线连接在一起。CPU包括运算器和控制器,运算器执行指令,控制器负责计算机的控制。存储器是计算机的记忆部件,以二进制形式存放程序和数据。输入输出系统包括大容量存储器,如硬盘,以及其他外设,如鼠标,键盘,显示器等。

2.2简述16位机的各类寄存器的主要作用。
答:(1)数据寄存器:Ax,Bx,Cx,Dx; AX:作为累加器,是算术运算的主要寄存器。在乘除等指令中存放操作数,在I/O指令中使用它与外部设备传送信息。BX:当通用寄存器使用,在计算存储器地址时,作基址寄存器使用。CX:当通用寄存器使用,此外常用来保存计数值,当计数器使用。
DX:当通用寄存器使用,一般在作双字长运算时把DX和AX组合使用,对某些I/O操作,DX用来存放I/O的端口地址。
(2)地址寄存器:Sp,Bp,Si,Di
(3)段寄存器:Cs,Ds,Es,Ss;段寄存器的作用是专用于存储器寻址,用来直接或间接地存放段地址。
(4)专用寄存器:Ip,Flags;Ip寄存器专门存放下一条指令的地址,Flags标志寄存器,又称程序状态寄存器。它是存放条件码标志、控制标志和系统标志的寄存器。

2.4 实模式下,写出段地址和偏移地址为1234:2002、1430:0042、FF00:0FFF的物理地址。
答:
1234:2002=12340+2002=14342
1430:0042=14300+0042=14342
FF00:0FFF=FF000+0FFF=FFFFF
2.8
52506=50000+2506,=52500+0006,基地址最大为5250,最小为5000.
段地址取值范围:0000—FFFF。既65536个。
2.9 从物理地址为00100H开始到00103H单元中顺序存放的数据为:12H,34H,56H,78H。请画出数据存放示意图,并回答以下问题:
(1) 写出00101H字节单元的内容
(2) 写出00102H字单元的内容
答案:
(1)(00101)= 34H
(2)(00102)= 7856H
习题3
3.1 写出从汇编语言源程序的建立到产生可执行文件的步骤和上机操作命令。
答:(1)用编辑程序EDIT建立 .ASM源文件
(2)用汇编程序MASM把.ASM文件原文件汇编成.OBJ文件
(3)用连接程序LINK将.OBJ文件转换成.EXE文件
(4)在DOS下直接运行.EXE文件或在DEBUG下调试该.EXE文件

3.2 列表文件.LST是在什么阶段产生的?列表文件.LST中有哪些内容?
答:*.LST 在汇编得到*.obj的同时得到,列表文件报告了汇编过程中产生的很多有价值的参考信息。主要包括源程序和机器语言清单、指令和变量的偏移地址等等。

3.3 写出定义一个代码段的语句,段名为MYPRG。
答:MYPRG segment
Assume cs:MYPRG
start:
MYPRG ends
End start

3.4 程序中用什么语句来结束程序的执行?用什么语句来表示程序的结束和指出程序执行的起点?
答:程序的结束:mov ah,4ch
int 21h
程序的结束和指出执行的起点:End start

3.5 汇编语言源程序的文件扩展名是什么?把它改为.EXE扩展名后,可以认为是可执行程序吗?
答:源程序的文件扩展名为*.asm,改扩展名不可以执行。

3.6 列出子目录C:\YOUPRG下的扩展名为.ASM的所有文件,在D盘根目录下建立一个子目录MYPRG,并进入子目录MYPRG,再把C:\YOUPRG下的文件YOU.ASM复制到D:\MYPRG下。写出完成以上要求的DOS命令。
答:(1)列出子目录:C:\YOUPRG>dir *.asm
(2)建立子目录:D:\>MD MYPRG
(3)复制: C:\YOUPRG>copy YOU.asm D:\MYPRG

3.7 下图为DEBUG调入的可执行程序,回答以下问题:
(1) 程序的起始物理地址是多少?结束地址是多少?
(2) CS寄存器的值是什么?
(3) 程序的功能是什么?
(4) 写出查看DS:0处内容的DEBUG命令。
(5) 程序中2处的INT 21指令执行后有什么结果?
(6) 如果要运行这个程序应该用什么DEBUG命令?
(7) DEBUG命令-T=0 4 之后,寄存器AX、DS、DX的值是多少?


答:(1)0B63:0000
(2)0B63
(3)显示0B62:0000存储的字符串
(4)-d 0B62:0000
(5)第一处显示字符串,第二处结束程序
(6)-g
(7)(AX)=0962,(DS)=0B62,(DX)=0000

 

3.8 解释DEBUG程序中的如下调试命令。
- D , - E, - T, - G, - A , - R
答:- D 显示内存内容
- E 修改内存单元内容
- T 跟踪命令
- G 运行命令
- A 汇编命令
- R 查看或修改寄存器内容

3.9 用DEBUG调入PROG.EXE后,若程序列出如下:
1234:0100 MOV BX, [4000]
1234:0104 MOV AX, [BP]
1234:0106 MOV AH, 1
1234:0108 INT 21
1234:010A MOV DL, AL
1234:010C MOV AH, 2
1234:010E INT 21
1234:0110 RET
列出上面程序的DEBUG命令是( )。
寄存器CS的值为( ),第一条指令的物理地址为( )。
如果要修改寄存器BX为1200H,应键入DEBUG命令( )。
若要修改第二条指令中的BP为BX,应键入DEBUG命令( ) 。
答:(1) U
(2) 1234H
(3) 12440H
(4) R BX
(5) A [0104]

3.10 简述DOS系统功能INT 21H调用方法。
答:(1)将调用功能的功能号存入AH寄存器。
(2)如必要,设置该调用功能的入口参数。
(3)执行INT 21H指令。
(4)如必要,按规定取得出口参数(返回参数)。

3.11 Debug命令调试含有“INT 21H”命令的程序段时,如何实现单步执行,“-t”命令为何无法实现?
答:“INT 21H”指令是Dos的系统调用,如果使用“-t”跟踪,则进入DOS系统子程序。如果希望单步执行,可以通过P命令或“-g=x x+1”来实现。

3.12 有主存数据段存放情况如下图所示,请写出代码,输出数据段的字符串“inspire a generation!”。

答: mov ax,145B
mov ds,ax
mov ah,09
mov dx,0
int 21h

习题4
4.1 何为段地址?何为有效地址? 何为物理地址?
答:

例如DS=6542H,指令mov ax,DS:[123A]; 123A为有效地址,6542H为段地址,65420H+0123AH=6665A即物理地址.

4.2 指出以下指令的寻址方式,array是变量。
(1)mov ax, 9
(2)mov byte ptr[bx],9
(3)mov bx,[di]
(4)mov ax,bx
(5)mov [si+bx],9
(6)mov array[bx],cx
(7)mov ax, array+9
(8)mov ax, array[bx+di]
答: (1)立即数寻址
(2)寄存器间接寻址
(3)变址寻址
(4)寄存器寻址
(5)基址变址寻址
(6)相对基址寻址
(7)直接寻址
(8)相对基址变址寻址

4.3 假定(DS)=1200H,(SS)=4400H, (BX)=463DH,(BP)=2006H, (SI)=6A00H,位移量D=4524H,以AX寄存器为目的操作数,试写出以下各种寻址方式下的传送指令,并确定源操作数的有效地址EA和物理地址。
(1)立即寻址
(2)直接寻址
(3)使用BX的寄存器寻址;无EA
(4)使用BX的间接寻址
(5)使用BP的寄存器相对寻址
(6)基址变址寻址
(7)相对基址变址寻址
答:(1)操作数在指令中无EA
(2)直接寻址:EA=4524H,物理地址=DS:4524
(3)使用BX的寄存器寻址:无EA
(4)使用BX的间接寻址:EA=463DH,物理地址=DS:463D
(5)使用BP的寄存器相对寻址:MOV AX,[BP+4524],EA=2006+4524,
物理地址=SS:EA
(6)基址变址寻址: MOV AX,[BX+SI],EA= BX+SI,物理地址=DS:EA
(7)相对基址变址寻址:MOV AX,[4524+BX+SI],EA=4524+BX+SI,
物理地址=DS:EA

4.4 在数据段定义了ARRAY数组,其中依次存储了五个字数据,ARRAY的起始地址(第一个数据的地址)为24H,请用不同寻址方式的指令,把第5个字送AX寄存器,指令条数不限。
答:(1)直接寻址
MOV AX,ARRAY+8 或MOV AX,[ARRAY+8]
(2)使用BX的间接寻址
LEA BX,ARRAY+8 ;MOV AX,[BX]
(3)使用BX的寄存器相对寻址
LEA BX,ARRAY ;MOV AX,[BX+8]
(4)基址变址寻址
LEA BX,ARRAY ; MOV SI,8 ; MOV AX,[BX+SI]

习题5
5.1 溢出标志OF与进位标志CF有何作用和区别?
答:处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;同时,根据是否超出有符号数的范围设置溢出标志OF。应该利用哪个标志,则由程序员来决定。也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;认为是有符号数,则要注意是否溢出。

5.2 带符号数比较大小,当AX < BX时程序转向标号L1,若前导指令为CMP AX, BX,后续指令应为什么?若视为二个无符号数比较大小, 后续指令应为什么?
答:带符号数:JL L1, 无符号数:JB L1

5.3 说出CALL指令和INT 21H指令的操作,有何异同?
答:CALL把断点压入堆栈,不一定是远调,INT 21H还要把FLAGS压入堆栈,且是远调,总入口地址为84H内存中的两个字。

5.4 除了用4CH号系统功能调用结束程序的执行并退出,还有哪些办法?
答:RET指令,INT 20H,但要正确使用。

5.5 V是变量,指出下列错误的指令,说出错误原因,并给出合适的修改。
(1) MOV AX,[DX]
(2) MOV DS,DATA
(3) MOV CS,AX
(4) MOV AX,DL
(5) PUSH AL
(6) ADD [BX],[DI]
(7) LEA [BX],V
(8) MOV [DX],OFFSET V
(9) MOV [SI],2
(10) MUL BX,CX
(11) DIV 5
(12) MOV BYTE[SI],AX
(13) MOV AX,[SI+DI]
(14) SHR AX,4
(15) CMP 6,AX
(16) MOV [FFFF],AX
(17) MOV AX,BX+4
(18) JMP FAR PRO
答: (1) MOV AX,[BX]
(2) MOV DS,BX
(3) MOV ES,AX
(4) MOV AL,DL
(5) PUSH AX
(6) ADD [BX],DI
(7) LEA BX,V
(8) MOV DX,OFFSET V
(9) MOV WORD PTR [SI],AX
(10) MUL BX
(11) DIV BX
(12) MOV BYTE PTR [SI],2
(13) MOV AX,[BX+SI]
(14) SHR AX,1
(15) CMP AX,6
(16) MOV [FFFE],AX
(17) MOV AX,[BX+4]
(18) JMP FAR PTR PRO

5.6 在数据段定义了ARRAY数组,其中依次存储了4个字数据,根据以下要求把第4个字送AX寄存器。
(1)直接寻址
(2)使用BX的间接寻址
(3)使用BX和 ARRAY的寄存器相对寻址
(4)基址变址寻址
(5)MOV以外的其它指令
答:(1)直接寻址
MOV AX,ARRAY+6 或MOV AX,[ARRAY+6]
(2)使用BX的间接寻址
LEA BX,ARRAY+6 ;MOV AX,[BX]
(3)使用BX和 ARRAY的寄存器相对寻址
LEA BX,ARRAY ;MOV AX,[BX+6]
(4)基址变址寻址
LEA BX,ARRAY ; MOV SI,6 ; MOV AX,[BX+SI]
(5)MOV以外的其它指令
SUB AX,AX; ADD AX,[ARRAY+6]

5.7 画出数据在数据段中的存放情况,程序执行后,BX、DI、CX、DX寄存器中的内容是什么? 程序如下:
data segment
array dw 20,30,40,20h,30h,-6
buff db ‘abcd$’
data ends
code segment
assume cs:code,ds:data
start:
mov ax, data
mov ds, ax
mov bx, array+1
mov di, offset array
mov cx, [di+5]
mov dl, buff+3
mov ah, 4ch
int 21h
code ends
end start
答: 14 00 1E 00 28 00 20 00 30 00 FA FF 61 62 63 64 $
(BX)=1E00H,(DI)=0000H,(CX)=2000H,(DX)=0064H

5.8 在DEBUG下设置(SP)=20H,设置AX、BX、CX、DX为不同值,把这四个寄存器内容依次压入堆栈,再从堆栈中依次弹出到SI、DI、BP、BX寄存器。写出一段程序实现上述操作,并画出每条入栈指令执行后SP和堆栈中数据的变化。
答:
code segment
assume cs:code
start:
push AX
push BX
push CX
Push DX
Pop SI
Pop DI
Pop BP
Pop BX
Hlt
Code ends
End start

5.9 求出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

5.10 在数据段有32位的无符号数变量X,Y,按如下格式定义,其中‘?’请用数值代替,用16位指令按要求写出程序。
X DW ?,?
Y DW ?,?
Z DW ?,?,?,?
(1)Z=X+Y。
(2)Z=X-Y。
(3)Z=|X-Y|。
(4)Z=X×Y。
答:(1)X和Y两个字数据相加,和存放在Z中。
MOV AX,X
MOV DX,X+2
ADD AX,Y
ADC DX,Y+2
MOV Z,AX
MOV Z+2,DX
(2)MOV AX,X
MOV DX,X+2
SUB AX,Y
SBB DX,Y+2
MOV Z,AX
MOV Z+2,DX
(3)MOV AX,X
MOV DX,X+2
SUB AX,Y
SBB DX,Y+2
TEST AX,8000H
JZ Exit
NOT AX
NOT DX
ADD DX,1
ADC AX,0
Exit: MOV Z,AX
MOV Z+2,DX
(4)MOV AX,X
MUL Y
MOV Z,AX
MOV Z+2,DX
MOV AX,X+2
MUL Y
ADD Z+2,AX
ADC DX,0
MOV Z+4,DX
MOV AX,X
MUL Y+2
ADD Z+4,AX
ADC DX,0
MOV Z+6,DX
MOV AX,X+2
MUL Y+2
ADD Z+6,AX
ADC DX,0
MOV Z+8,DX

5.11用移位指令为主实现对AX中的无符号数乘以5,不考虑乘积可能超出16位。
答: MOV DX,AX
MOV CL,2
SHL AX,CL
ADD AX,DX

5.12 用移位指令为主实现对AX中的无符号数乘以5,考虑乘积可能超出16位的情况。
答: MOV DX,0
MOV BX,AX
SHL AX,1
ADC DX,0
SHL DX,1
SHL AX,1
ADC DX,0
ADD AX,BX
ADC DX,0
5.13 把AX中的内容依次倒排序,即第0位移到第15位,第1位移到第14位,…。
答:先设AX值
Mov di,0
Mov bx,0
Mov si,1
Mov cl,2
Ror ax,1
K: Rol ax,cl
Mov bx,ax
And bx,si
Add di,bx
Shl,si,1
Cmp si,0
Jnz k
Mov ax,di

5.14 在数据段有如下定义:
BUFF DB ‘ABCD$EFGHIJK$’
STR1 DB 12 DUP(?)
LEN DB ?
用串指令编写程序完成以下操作:
(1) 对字符串STR1全部置‘*’符。
(2) 从左到右把BUFF中的字符串传送到STR1。
(3) 从右到左把BUFF中的字符串传送到STR1。
(4) 比较BUFF与STR1两个字符串是否相等,如相等则DX=1,否则DX=0。
(5) 查找BUFF中有无字符$,把字符$出现的次数计入BX寄存器。
答:
(1)
MOV AX,DATA
MOV DS,AX
MOV AL,‘*’
LEA DI,STR1
MOV CX,STR1-BUFF
CLD
REP STOSB
(2)
MOV AX,DATA
MOV DS,AX
MOV ES,AX
CLD
LEA SI,BUFF
LEA DI,STR1
MOV CX,STR1-BUFF
REP MOVSB
(3)
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)
MOV AX,DATA
MOV DS,AX
MOV ES,AX
CLD
LEA SI,BUFF
LEA DI,STR1
MOV CX,STR1-BUFF
REPE CMPSB

(5)
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

5.15 对于给定的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=790EH, BX=8831H
(3) AX=E002H, BX=8086H
答:L1,L1,L1,L5

5.16 下面不完整的程序段是比较AX和BX的值,把其中大的数送MAX变量。如果是无符号数,应如何填写指令?如果是有符号数,应如何填写指令?
CMP AX,BX
( )
MOV MAX,AX
( )
L1:MOV MAX,BX
L2:HLT
答: JB L1
JMP L2

5.17 在下列程序段的括号中分别填入如下指令,程序执行完后,AX、CX的内容是什么?
(1) LOOP L1
(2) LOOPE L1
(3) LOOPNZ L1
MOV AX, 6
MOV CX,3
L1:ROL AX,CL
TEST AL,3
( )

答:(1)AX=0180H,CX=0000
(2)AX=0003H,CX=0002
(3)AX=0180H,CX=0000

5.18 测试AL寄存器,如果最高位和最低位同时为0,则转L0,如果最高位和最低位只有一位为1,则转L1,如果最高位和最低位同时为1,则转L2。画出流程图,并编写程序段。
答:
Code segment
Assume cs:code
Start:

ROR AL,1
AND AL,3
JZ L0
SUB AL,3
JZ L2
JMP L1
L0:
JMP Exit
L1:
JMP Exit
L2:
Exit:hlt
code ends
end start

5.19 从键盘输入一个英文字母,显示输出其大写。画出流程图,并编写程序段。
答:
Code segment
Assume cs:code
Start:
Mov ah,1
Int 21h
sub al,20h
mov dl,al
mov ah,2
int 21h
hlt
code ends
end start

5.20 从键盘输入一位数字N,显示输出N个N。画出流程图,并编写程序段。
答:
CODE SEGMENT
ASSUME CS:CODE
START:
MOV AH,1
INT 21H
MOV DL,AL
AND AL, 0FH
MOV CL,AL
MOV CH,0
NEXT: MOV AH,2
INT 21H
LOOP NEXT
MOV 4CH
INT 21H
CODE ENDS
END START

5.21 在数据段有压缩的BCD码表示的十进制数,写出指令分别完成十进制加法A+B,K+J和减法A-B,K-J。结果放在AX,回答AX的内容。
A DB 65H,
B DB 37H
K DB 98H
J DB 69H
答:(1) MOV Al,A
MOV Bl,B
ADD AL,BL
AAA
SUB AL,BL
DAS
(2) MOV Al,K
MOV Bl,J
ADD AL,BL
AAA
SUB AL,BL
DAS
(1)A+B=9CH,AX=0102H.A-B=2EH,AX=0028H
(2)K+J=01H,AX=0107H.K-J=2FH,AX=0029H

5.22 用相对基址变址寻址方法求ARRAY行列式的值。
ARRAY DW 2,3,5
DW 1,4,6
DW 2,7,9
答:
data segment
Array dw 2,3,5
dw 1,4,6
dw 2,7,9
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
mov ax,0
mov bx,0fffah
a: mov si,0
add bx,6
cmp bx,13
jg d

b: add ax,array[bx][si]
cmp si,3
jg a
add si,2
jmp b
d: hlt
code ends
end start

3 评论

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注