汇编语言程序的设计答案文档格式.docx
《汇编语言程序的设计答案文档格式.docx》由会员分享,可在线阅读,更多相关《汇编语言程序的设计答案文档格式.docx(73页珍藏版)》请在冰豆网上搜索。
(3)85-(-69)=0055H-0FFBBH=009AH=154,CF=1,OF=0
(4)85-(69)=0055H-0045H=0010H=16,CF=0,OF=0
1.8简述计算机系统组成。
计算机由中央处理器CPU,存储器,输入系统,输出系统组成,由系统总线连接在一起。
CPU包括运算器和控制器,运算器执行指令,控制器负责计算机的控制。
存储器是计算机的记忆部件,以二进制形式存放程序和数据。
输入输出系统包括大容量存储器,如硬盘,以及其他外设,如鼠标,键盘,显示器等。
1.9简述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标志寄存器,又称程序状态寄存器。
它是存放条件码标志、控制标志和系统标志的寄存器。
1.10实模式下,写出段地址和偏移地址为1234:
2002、1430:
0042、FF00:
0FFF的物理地址。
1234:
2002=12340+2002=14342
1430:
0042=14300+0042=14342
FF00:
0FFF=FF000+0FFF=FFFFF
1.11
52506=50000+2506,=52500+0006,基地址最大为5250,最小为5000.
段地址取值围:
0000—FFFF。
既65536个。
1.12从物理地址为00100H开始到00103H单元中顺序存放的数据为:
12H,34H,56H,78H。
请画出数据存放示意图,并回答以下问题:
(1)写出00101H字节单元的容
(2)写出00102H字单元的容
答案:
(1)(00101)=34H
(2)(00102)=7856H
习题2
2.1写出从汇编语言源程序的建立到产生可执行文件的步骤和上机操作命令。
(1)用编辑程序EDIT建立.ASM源文件
(2)用汇编程序MASM把.ASM文件原文件汇编成.OBJ文件
(3)用连接程序LINK将.OBJ文件转换成.EXE文件
(4)在DOS下直接运行.EXE文件或在DEBUG下调试该.EXE文件
2.2列表文件.LST是在什么阶段产生的?
列表文件.LST中有哪些容?
*.LST在汇编得到*.obj的同时得到,列表文件报告了汇编过程中产生的很多有价值的参考信息。
主要包括源程序和机器语言清单、指令和变量的偏移地址等等。
2.3写出定义一个代码段的语句,段名为MYPRG。
MYPRGsegment
Assumecs:
MYPRG
start:
MYPRGends
Endstart
2.4程序中用什么语句来结束程序的执行?
用什么语句来表示程序的结束和指出程序执行的起点?
程序的结束:
movah,4ch
int21h
程序的结束和指出执行的起点:
Endstart
2.5汇编语言源程序的文件扩展名是什么?
把它改为.EXE扩展名后,可以认为是可执行程序吗?
源程序的文件扩展名为*.asm,改扩展名不可以执行。
2.6列出子目录C:
\YOUPRG下的扩展名为.ASM的所有文件,在D盘根目录下建立一个子目录MYPRG,并进入子目录MYPRG,再把C:
\YOUPRG下的文件YOU.ASM复制到D:
\MYPRG下。
写出完成以上要求的DOS命令。
答:
(1)列出子目录:
C:
\YOUPRG>
dir*.asm
(2)建立子目录:
D:
\>
MDMYPRG
(3)复制:
C:
copyYOU.asmD:
\MYPRG
2.7下图为DEBUG调入的可执行程序,回答以下问题:
(1)程序的起始物理地址是多少?
结束地址是多少?
(2)CS寄存器的值是什么?
(3)程序的功能是什么?
(4)写出查看DS:
0处容的DEBUG命令。
(5)程序中2处的INT21指令执行后有什么结果?
(6)如果要运行这个程序应该用什么DEBUG命令?
(7)DEBUG命令-T=04之后,寄存器AX、DS、DX的值是多少?
(1)0B63:
0000
(2)0B63
(3)显示0B62:
0000存储的字符串
(4)-d0B62:
0000
(5)第一处显示字符串,第二处结束程序
(6)-g
(7)(AX)=0962,(DS)=0B62,(DX)=0000
2.8解释DEBUG程序中的如下调试命令。
-D,-E,-T,-G,-A,-R
-D显示存容
-E修改存单元容
-T跟踪命令
-G运行命令
-A汇编命令
-R查看或修改寄存器容
2.9用DEBUG调入PROG.EXE后,若程序列出如下:
1234:
0100MOVBX,[4000]
0104MOVAX,[BP]
0106MOVAH,1
0108INT21
010AMOVDL,AL
010CMOVAH,2
010EINT21
0110RET
列出上面程序的DEBUG命令是()。
寄存器CS的值为(),第一条指令的物理地址为()。
如果要修改寄存器BX为1200H,应键入DEBUG命令()。
若要修改第二条指令中的BP为BX,应键入DEBUG命令()。
(1)U
(2)1234H
(3)12440H
(4)RBX
(5)A[0104]
2.10简述DOS系统功能INT21H调用方法。
(1)将调用功能的功能号存入AH寄存器。
(2)如必要,设置该调用功能的入口参数。
(3)执行INT21H指令。
(4)如必要,按规定取得出口参数(返回参数)。
2.11Debug命令调试含有“INT21H”命令的程序段时,如何实现单步执行,“-t”命令为何无法实现?
“INT21H”指令是Dos的系统调用,如果使用“-t”跟踪,则进入DOS系统子程序。
如果希望单步执行,可以通过P命令或“-g=xx+1”来实现。
2.12有主存数据段存放情况如下图所示,请写出代码,输出数据段的字符串“inspireageneration!
”。
movax,145B
movds,ax
movah,09
movdx,0
int21h
习题3
3.1何为段地址?
何为有效地址?
何为物理地址?
例如DS=6542H,指令movax,DS:
[123A];
123A为有效地址,6542H为段地址,65420H+0123AH=6665A即物理地址.
3.2指出以下指令的寻址方式,array是变量。
(1)movax,9
(2)movbyteptr[bx],9
(3)movbx,[di]
(4)movax,bx
(5)mov[si+bx],9
(6)movarray[bx],cx
(7)movax,array+9
(8)movax,array[bx+di]
(1)立即数寻址
(2)寄存器间接寻址
(3)变址寻址
(4)寄存器寻址
(5)基址变址寻址
(6)相对基址寻址
(7)直接寻址
(8)相对基址变址寻址
3.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的寄存器寻址:
(4)使用BX的间接寻址:
EA=463DH,物理地址=DS:
463D
(5)使用BP的寄存器相对寻址:
MOVAX,[BP+4524],EA=2006+4524,
物理地址=SS:
EA
(6)基址变址寻址:
MOVAX,[BX+SI],EA=BX+SI,物理地址=DS:
(7)相对基址变址寻址:
MOVAX,[4524+BX+SI],EA=4524+BX+SI,
物理地址=DS:
3.4在数据段定义了ARRAY数组,其中依次存储了五个字数据,ARRAY的起始地址(第一个数据的地址)为24H,请用不同寻址方式的指令,把第5个字送AX寄存器,指令条数不限。
(1)直接寻址
MOVAX,ARRAY+8或MOVAX,[ARRAY+8]
(2)使用BX的间接寻址
LEABX,ARRAY+8;
MOVAX,[BX]
(3)使用BX的寄存器相对寻址
LEABX,ARRAY;
MOVAX,[BX+8]
(4)基址变址寻址
MOVSI,8;
MOVAX,[BX+SI]
习题4
4.1溢出标志OF与进位标志CF有何作用和区别?
处理器对两个操作数进行运算时,按照无符号数求得结果,并相应设置进位标志CF;
同时,根据是否超出有符号数的围设置溢出标志OF。
应该利用哪个标志,则由程序员来决定。
也就是说,如果将参加运算的操作数认为是无符号数,就应该关心进位;
认为是有符号数,则要注意是否溢出。
4.2带符号数比较大小,当AX<
BX时程序转向标号L1,若前导指令为CMPAX,BX,后续指令应为什么?
若视为二个无符号数比较大小,后续指令应为什么?
带符号数:
JLL1,无符号数:
JBL1
4.3说出CALL指令和INT21H指令的操作,有何异同?
CALL把断点压入堆栈,不一定是远调,INT21H还要把FLAGS压入堆栈,且是远调,总入口地址为84H存中的两个字。
4.4除了用4CH号系统功能调用结束程序的执行并退出,还有哪些办法?
RET指令,INT20H,但要正确使用。
4.5V是变量,指出下列错误的指令,说出错误原因,并给出合适的修改。
(1)MOVAX,[DX]
(2)MOVDS,DATA
(3)MOVCS,AX
(4)MOVAX,DL
(5)PUSHAL
(6)ADD[BX],[DI]
(7)LEA[BX],V
(8)MOV[DX],OFFSETV
(9)MOV[SI],2
(10)MULBX,CX
(11)DIV5
(12)MOVBYTE[SI],AX
(13)MOVAX,[SI+DI]
(14)SHRAX,4
(15)CMP6,AX
(16)MOV[FFFF],AX
(17)MOVAX,BX+4
(18)JMPFARPRO
(1)MOVAX,[BX]
(2)MOVDS,BX
(3)MOVES,AX
(4)MOVAL,DL
(5)PUSHAX
(6)ADD[BX],DI
(7)LEABX,V
(8)MOVDX,OFFSETV
(9)MOVWORDPTR[SI],AX
(10)MULBX
(11)DIVBX
(12)MOVBYTEPTR[SI],2
(13)MOVAX,[BX+SI]
(14)SHRAX,1
(15)CMPAX,6
(16)MOV[FFFE],AX
(17)MOVAX,[BX+4]
(18)JMPFARPTRPRO
4.6在数据段定义了ARRAY数组,其中依次存储了4个字数据,根据以下要求把第4个字送AX寄存器。
(1)直接寻址
(3)使用BX和ARRAY的寄存器相对寻址
(4)基址变址寻址
(5)MOV以外的其它指令
MOVAX,ARRAY+6或MOVAX,[ARRAY+6]
(2)使用BX的间接寻址
LEABX,ARRAY+6;
(3)使用BX和ARRAY的寄存器相对寻址
MOVAX,[BX+6]
MOVSI,6;
(5)MOV以外的其它指令
SUBAX,AX;
ADDAX,[ARRAY+6]
4.7画出数据在数据段中的存放情况,程序执行后,BX、DI、CX、DX寄存器中的容是什么?
程序如下:
datasegment
arraydw20,30,40,20h,30h,-6
buffdb‘abcd$’
dataends
codesegment
assumecs:
code,ds:
data
start:
movax,data
movds,ax
movbx,array+1
movdi,offsetarray
movcx,[di+5]
movdl,buff+3
movah,4ch
int21h
codeends
endstart
14001E00280020003000FAFF61626364$
(BX)=1E00H,(DI)=0000H,(CX)=2000H,(DX)=0064H
4.8在DEBUG下设置(SP)=20H,设置AX、BX、CX、DX为不同值,把这四个寄存器容依次压入堆栈,再从堆栈中依次弹出到SI、DI、BP、BX寄存器。
写出一段程序实现上述操作,并画出每条入栈指令执行后SP和堆栈中数据的变化。
codesegment
assumecs:
code
pushAX
pushBX
pushCX
PushDX
PopSI
PopDI
PopBP
PopBX
Hlt
Codeends
Endstart
4.9求出7450H与以下各十六进制数的和及差,并根据结果标出SF、ZF、CF、OF标志位的值。
(1)1234H
(2)5678H(3)9804H(4)E0A0H
SF、ZF、CF、OF
(1)1234H+7450H,1001
(2)5678H+7450H,1001
(3)9804H+7450H,0010
(4)E0A0H+7450H,0010
4.10在数据段有32位的无符号数变量X,Y,按如下格式定义,其中‘?
’请用数值代替,用16位指令按要求写出程序。
XDW?
,?
YDW?
ZDW?
(1)Z=X+Y。
(2)Z=X-Y。
(3)Z=|X-Y|。
(4)Z=X×
Y。
(1)X和Y两个字数据相加,和存放在Z中。
MOVAX,X
MOVDX,X+2
ADDAX,Y
ADCDX,Y+2
MOVZ,AX
MOVZ+2,DX
(2)MOVAX,X
SUBAX,Y
SBBDX,Y+2
(3)MOVAX,X
TESTAX,8000H
JZExit
NOTAX
NOTDX
ADDDX,1
ADCAX,0
Exit:
(4)MOVAX,X
MULY
MOVAX,X+2
ADDZ+2,AX
ADCDX,0
MOVZ+4,DX
MOVAX,X
MULY+2
ADDZ+4,AX
MOVZ+6,DX
ADDZ+6,AX
MOVZ+8,DX
4.11用移位指令为主实现对AX中的无符号数乘以5,不考虑乘积可能超出16位。
MOVDX,AX
MOVCL,2
SHLAX,CL
ADDAX,DX
4.12用移位指令为主实现对AX中的无符号数乘以5,考虑乘积可能超出16位的情况。
MOVDX,0
MOVBX,AX
SHLAX,1
SHLDX,1
SHLAX,1
ADDAX,BX
4.13把AX中的容依次倒排序,即第0位移到第15位,第1位移到第14位,…。
先设AX值
Movdi,0
Movbx,0
Movsi,1
Movcl,2
Rorax,1
K:
Rolax,cl
Movbx,ax
Andbx,si
Adddi,bx
Shl,si,1
Cmpsi,0
Jnzk
Movax,di
4.14在数据段有如下定义:
BUFFDB‘ABCD$EFGHIJK$’
STR1DB12DUP(?
)
LENDB?
用串指令编写程序完成以下操作:
(1)对字符串STR1全部置‘*’符。
(2)从左到右把BUFF中的字符串传送到STR1。
(3)从右到左把BUFF中的字符串传送到STR1。
(4)比较BUFF与STR1两个字符串是否相等,如相等则DX=1,否则DX=0。
(5)查找BUFF中有无字符$,把字符$出现的次数计入BX寄存器。
(1)
MOVAX,DATA
MOVDS,AX
MOVAL,‘*’
LEADI,STR1
MOVCX,STR1-BUFF
CLD
REPSTOSB
(2)
MOVES,AX
LEASI,BUFF
REPMOVSB
(3)
STD
LEASI,STR1-1
LEADI,LEN-1
(4)
REPECMPSB
(5)
MOVBX,0
MOVAL,‘$’
NEXT:
REPNESCASB
JCXZNO-FOUND
INCBX
JMPNEXT
4.15对于给定的AX和