某小程序自定义组件数据数据段定义如下,假设(DS)=6000H,请画出内存单元数据分配示意图。

您所在位置: &
&nbsp&&nbsp&nbsp&&nbsp
汇编语言程序设课后习题解答.doc 40页
本文档一共被下载:
次 ,您可全文免费在线阅读后下载本文档。
下载提示
1.本站不保证该用户上传的文档完整性,不预览、不比对内容而直接下载产生的反悔问题本站不予受理。
2.该文档所得收入(下载+内容+预览三)归上传者、原创者。
3.登录后可充值,立即自动返金币,充值渠道很便利
汇编语言程序设课后习题解答
你可能关注的文档:
··········
··········
《汇编语言程序设计》(宋人杰 主编)课后习题解答
第1章 汇编语言基础知识
1.简述汇编语言源程序、汇编程序、和目标程序的关系。
答:用汇编语言编写的程序称为汇编源程序;汇编源程序在汇编程序的翻译下转换成计算机语言变成目标程序。
2. 简述汇编语言的优缺点。
答:(1) 汇编语言的优点:
① 可有效地访问、控制计算机各种硬件设备,如磁盘、存储器、CPU、I/O端口等。.目标代码简短,占用内存少,执行速度快,是高效的程序设计语言。与高级语言配合使用,应用十分广泛。CPU的寻址能力为8KB,那么它的地址总线的宽度为多少?
4. 1KB的存储器有多少个存储单元?
答:1024个字节。
5. 指令中的逻辑地址由哪两部分组成?
答:指令中的逻辑地址由段基址和偏移量组成。
6. 以下为用段基址:偏移量形式表示的内存地址,试计算它们的物理地址。
(1) 12F8:0100
(2) 1A2F:0103
(3) 1A3F:0003
(4) 1A3F:A1FF
(1) 13080H
(2) 1A3F3H
(3) 1A3F3H
(4) 245EFH
7. 自12FA:0000开始的内存单元中存放以下数据(用十六进制形式表示): 03 06 11 A3 13 01,试分别写出12FA:0002的字节型数据、字型数据及双字型数据的值。
字节型数据:11H
字型数据:0A311H
双字型数据:H
8. 内存中某单元的物理地址是19318H,段基地址为1916H,则段内偏移地址为多少?若段内偏移地址为2228H,则段基地址为多少?
答:若段基地址为1916H,则段内偏移地址为01B8H;若段内偏移地址为2228H,则段基地址为170FH
9. 在实模式环境中,一个段最长不能超过多少字节?
10. 实模式可寻址的内存范围是多少?
第2章 汇编语言源程序格式
1.请解释变量和标号的含义,两者有何区别?
答:标号代表一条指令所在单元的地址,在代码段中定义;变量是存放数据的存储单元的地址符号名,在除代码段以外的其他段中定义。变量和标号的主要区别在于变量指的是数据,而标号则对应的是指令LENGTH和SIZE的区别。
答:⑴数值返回运算符包括:SEG(取段地址)、OFFSET(取偏移地址)、TYPE(取类型值)、LENGTH(取长度)、SIZE(取总字节数)。⑵对于变量中使用DUP的情况,LENGTH回送分配给该变量的单元数,对于其他情况则送1;而SIZE会送分配给变量的总字节数,也就是LENGTH和TYPE的乘积。
5. 画图说明下列伪指令所定义的数据在内存中的存放形式。
DUP(1,2,DUP(2,5),3)
答:(1) 见题图2.1
(2) 见题图2.2
(3) 见题图2.3
(4) 见题图2.4
(5) 题图2.5
6. 写出下列变量定义语句。
(1) 为缓冲区BUF1预留20B的存储空间。
(2) 将字符串‘ABCD’,‘1234’BUF2存储区中。
7. 符号定义语句如下:
2,3,4,5,‘345’
问LT的值是多少?
答:LT的值为7
8. 假设程序中的数据定义如下:
问T的值是多少?它表示什么意义?
答:T的值是22;它表示从变量A到T之间分配的存储空间(字节)数目。
9. 如何规定一个程序执行的开始位置?主程序执行结束应该如何返回DOS?源程序在何处停止汇编过程?
答:程序开始位置:END伪指令后的标号所对应的地址;应用程序开始伪指令.STARTUP处。
返回DOS:RET指令结合PUSH DS等指令;用DOS功能调用的第4CH号中断;.EXIT伪指令。
END伪指令处停止汇编过程。
10.EQU伪指令与“=”伪指令有何区别?
答:在同一程序中,“
正在加载中,请稍后...写出程序段:将2000H:1200H开始的100个字节数据传送到6000H:0000H开始的内存单元中去_百度知道
写出程序段:将2000H:1200H开始的100个字节数据传送到6000H:0000H开始的内存单元中去
我有更好的答案
x86: mov ds,2000mov si,1200mov es,6000mov di,0000mov cx,0064l1:mov al, ds:[si]mov es:[di],alinc siind didec cxjnz l1:
采纳率:50%
为您推荐:
其他类似问题
内存单元的相关知识
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。2013(1)《电信微机接口》作业题解_百度文库
您的浏览器Javascript被禁用,需开启后体验完整功能,
享专业文档下载特权
&赠共享文档下载特权
&10W篇文档免费专享
&每天抽奖多种福利
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
2013(1)《电信微机接口》作业题解
&&微机原理与接口技术
阅读已结束,下载本文需要
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,同时保存到云知识,更方便管理
加入VIP
还剩24页未读,
定制HR最喜欢的简历
你可能喜欢今天是你余生的第一天!
《汇编语言程序设计教程》人民邮电出版社第二版习题及参考答案
网上的答案是第一版的,重新整理了一下
《汇编语言程序设计教程》人民邮电出版社第二版
刘慧婷,王庆生 主编
习题及参考答案
更多汇编内容请访问:
第一章至第五章
核对及编辑:xyjigsaw
1.1 什么是机器语言?什么是汇编语言?简述汇编语言的特点。
机器语言就是用二进制编码组成的机器指令的集合和一组使用机器指令的规则。汇编语言是对机器指令中的操作码用英文单词的缩写描述,对操作数用标号、变量、常量描述。
汇编语言的特点:
(1)与机器有关:移植性差,但可直接控制硬件。
(2)程序效率高。
(3)局限性:受指令的限制,如考虑存储单元等。
(4)调试困难。
1.2 汇编程序与汇编源程序的区别是什么?
汇编源程序是指用汇编语言编写的程序,而汇编程序特指将汇编源程序汇编成目标文件的编译程序。
1.3 把下列十进制数转换为二进制数和十六进制数。
(1)67 (2)34 (3)254 (4)123
答:(1) (2)100010, 22
(3),FE (4)111 1011,7B
1.4 把下列二进制数转换为十六进制数和十进制数。
(1)))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) (2)[]原=[]补
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=5H,-69=0FFBBH,
(1)85+69 =H=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)=H=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 实模式下,写出段地址和偏移地址为、、FF00:0FFF的物理地址。
FF00:0FFF=FF000+0FFF=FFFFF
+2506,=,基地址最大为5250,最小为5000.
段地址取值范围:0000—FFFF。既65536个。
2.9 从物理地址为00100H开始到00103H单元中顺序存放的数据为:12H,34H,56H,78H。请画出数据存放示意图,并回答以下问题:
(1) 写出00101H字节单元的内容
(2) 写出00102H字单元的内容
(1)(00101)= 34H
(2)(00102)= 7856H
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
MYPRG ends
3.4 程序中用什么语句来结束程序的执行?用什么语句来表示程序的结束和指出程序执行的起点?
答:程序的结束:mov ah,4ch
程序的结束和指出执行的起点: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
(3)显示0B62:0000存储的字符串
(4)-d 0B62:0000
(5)第一处显示字符串,第二处结束程序
(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后,若程序列出如下:
MOV BX, [:0104 MOV AX, [BP]
A MOV DL, AL
C MOV AH, 2
列出上面程序的DEBUG命令是( )。
寄存器CS的值为( ),第一条指令的物理地址为( )。
如果要修改寄存器BX为1200H,应键入DEBUG命令( )。
若要修改第二条指令中的BP为BX,应键入DEBUG命令( ) 。
(3) 12440H
(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
4.1 何为段地址?何为有效地址? 何为物理地址?
例如DS=6542H,指令mov ax,DS:[123A]; 123A为有效地址,6542H为段地址,6AH=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=,
物理地址=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.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′dataendscodesegmentassumecs:code,ds:datastart:movax,datamovds,axmovbx,array+1movdi,offsetarraymovcx,[di+5]movdl,buff+3movah,4chint21hcodeendsendstart答:14001E00280020003000FAFF61626364
(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
5.9 求出7450H与以下各十六进制数的和及差,并根据结果标出SF、ZF、CF、OF标志位的值。
(1) 1234H (2)5678H (3)9804H (4)E0A0H
答: SF、ZF、CF、OF
(1)H, 1 0 0 1
(2)H, 1 0 0 1
(3)H, 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 DX,X+2
ADC DX,Y+2
MOV Z+2,DX
(2)MOV AX,X
MOV DX,X+2
SBB DX,Y+2
MOV Z+2,DX
(3)MOV AX,X
MOV DX,X+2
SBB DX,Y+2
TEST AX,8000H
Exit: MOV Z,AX
MOV Z+2,DX
(4)MOV AX,X
MOV Z+2,DX
MOV AX,X+2
ADD Z+2,AX
MOV Z+4,DX
ADD Z+4,AX
MOV Z+6,DX
MOV AX,X+2
ADD Z+6,AX
MOV Z+8,DX
5.11用移位指令为主实现对AX中的无符号数乘以5,不考虑乘积可能超出16位。
答: MOV DX,AX
SHL AX,CL
ADD AX,DX
5.12 用移位指令为主实现对AX中的无符号数乘以5,考虑乘积可能超出16位的情况。
答: MOV DX,0
MOV BX,AX
ADD AX,BX
5.13 把AX中的内容依次倒排序,即第0位移到第15位,第1位移到第14位,…。
答:先设AX值
K: Rol ax,cl
5.14 在数据段有如下定义:
BUFF DB ‘ABCDEFGHIJK’
STR1 DB 12 DUP(?)
用串指令编写程序完成以下操作:
(1) 对字符串STR1全部置‘*’符。
(2) 从左到右把BUFF中的字符串传送到STR1。
(3) 从右到左把BUFF中的字符串传送到STR1。
(4) 比较BUFF与STR1两个字符串是否相等,如相等则DX=1,否则DX=0。
(5) 查找BUFF中有无字符,把字符出现的次数计入BX寄存器。
MOV AX,DATA
MOV DS,AX
MOV AL,‘*’
LEA DI,STR1
MOV CX,STR1-BUFF
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,BUFF
LEA DI,STR1
MOV CX,STR1-BUFF
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,STR1-1
LEA DI,LEN-1
MOV CX,STR1-BUFF
MOV AX,DATA
MOV DS,AX
MOV ES,AX
LEA SI,BUFF
LEA DI,STR1
MOV CX,STR1-BUFF
REPE CMPSB
MOV AX,DATA
MOV ES,AX
MOV AL,‘$’
LEA SI,BUFF
MOV CX,STR1-BUFF
NEXT: REPNE SCASB
JCXZ NO-FOUND
5.15 对于给定的AX和BX的值,执行下列程序段,程序将转向哪里?
ADD AX, BX
SUB AX,BX
(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
答: JB L1
5.17 在下列程序段的括号中分别填入如下指令,程序执行完后,AX、CX的内容是什么?
(1) LOOP L1
(2) LOOPE L1
(3) LOOPNZ L1
MOV AX, 6
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
5.19 从键盘输入一个英文字母,显示输出其大写。画出流程图,并编写程序段。
Code segment
Assume cs:code
sub al,20h
5.20 从键盘输入一位数字N,显示输出N个N。画出流程图,并编写程序段。
CODE SEGMENT
ASSUME CS:CODE
AND AL, 0FH
NEXT: MOV AH,2
5.21 在数据段有压缩的BCD码表示的十进制数,写出指令分别完成十进制加法A+B,K+J和减法A-B,K-J。结果放在AX,回答AX的内容。
答:(1) MOV Al,A
(2) MOV Al,K
(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
code segment
assume cs:code,ds:data
mov ax,data
mov bx,0fffah
a: mov si,0
b: add ax,array[bx][si] cmp si,3
6.1 画图说明下列数据定义语句所示内存空间的数据,并回答寄存器的值。
ARRAY LABEL
DW 2,9,14,3,315H,-6
DB 7,‘ABCDEDFG’
LEN = $-DA2
DUP(2 DUP(1,2,3),4)
。。。。。。
AL,ARRAY+2
AX,DA2-DA1
BX, OFFSET
DX, LENGTH
BX, WORD PTR
AL,ARRAY+2
(AL)=( 09
(AL)=( 41
AX,DA2-DA1
(AX)=( 000c
(AX)=( 0102
BX, OFFSET
DX, LENGTH
BX, WORD PTR
6.2 变量和标号有哪些区别?变量和标号有哪些属性?如何获取属性值?写出指令。
答:变量是为指令提供的操作数,标号是为指令提供标识,都是为了在指令中引用。它们最主要的属性有:偏移属性,段属性,类型属性。例如:
BX, OFFSET
VAL ;取偏移属性
;取段属性
;取类型属性
6.3 指令和伪指令的区别在哪里?伪指令可以出现在代码段吗?指令可以在数据段吗?
答:指令只能出现在代码段,定义数据的伪指令通常在数据段,伪指令在代码段两端也可,但不能在指令之间。
6.4 下面的程序能否输出字符0~9?如不能,应如何修改?
ASSUME CS:CODE
答:通过汇编和连接可以运行,但程序真正意图是输出ASCII码为30H~39H的字符0~9,应作修改。
ASSUME CS:CODE
;K=K+1是伪指令,没生成代码,改为 INC
6.5 用16位指令编写完整程序,并上机调试,计算V=(X+Y)*R,其中所有变量均为32位变量,X、Y、R的具体数值由你自己确定,变量定义格式如下:
DW 4 dup(?)
答:(32位指令)
data segment
v dw 4 dup(?)
code segment
assume cs:code,ds:data
mov ax,data
mov v+4,edx
add dl,30h
mov ah,4ch
6.6数据定义如下:执行下列指令,填写寄存器的值
2,9,14,3
7,‘ABCDEDF’
LEN = $-DA1
AL,ARRAY+2
AX,DA2-DA1
AL,ARRAY+2
AX,DA2-DA1
(AX)=( 0900
6.7 定义数据段,满足如下要求:
(1)array为字符串变量:‘inspire a generation!’
(2)data1 为十六进制数:0FEDCBAH
(3)data2为二进制数:B。
(4)data3为100个为零的字节变量。
(5)分配500个字的空间待用。
答: data segment
Array db ‘inspire a generation!’
Data2 db B
Data3 db 100 dup(0)
dw 500 dup(?)
6.8 假设程序中,数据段定义如下:
Data1 db 50 dup(?)
Data2 dw 10 dup(0)
5 dup(2 dup(1,2))
(1)用指令将数据段首地址放入数据段寄存器中。
(2)用一条指令将data2的第一个数据放入BX寄存器中。
(3)将数据段字节数放入CX寄存器。
答:mov ax,data1
mov ds,ax
Mov bx,data2[0]
Mov cx, 50+10*2+20*8
6.9现有数据定义如下:
5 DUP(0)
Array2 EQU BYTE PTR Array1
请说明这两个变量之间的联系。
答:当汇编后,PTR类型操作符使Array2具有Array1相同的段地址和偏移地址,但它的数据类型为字节型。
6.10 给出下列程序段汇编后的结果:
MOV BX,(Val1 LT 5) AND 20
MOV BX, (VAL2 GE 1) AND 30
MOV BX,(Val2
AND 5) OR (VAL1 GE 5)
MOV BX,(Val2 – VAL1) GE 5
答:MOV BX,0
6.11设数据段定义如下:
Data segment
Data2=data1+25h
Data3 db ‘123456’
Db 47h,48h
Count EQU $-data1
Data4 dw 49h,4Ah,4Bh
回答下列问题:
(1)Data1的偏移地址是多少?
(2)Count的值是多少?
答:(1)0020h
(2)0024h
6.12现有一数据区data1,需对其进行按字和按字节访问,请问应如何进行设置?
答:可以利用“LABEL“标签进行设置,如:
Operator_b LABEL
Operator_w
其中按字节访问时采用Operator_b变量,按字访问时采用Operator_w变量。
6.13请问什么是PSP,EXE文件和COM文件有何区别?
答:PSP是程序段前缀。程序在执行前调入内存,由DOS确定装入的起始地址,建立PSP,接着再装入程序,其大小为256个字节。EXE文件和COM文件相比,COM文件只有一个段地址,由二进制代码组成,比EXE文件小,并且要求程序从偏移地址0100H单元开始,因为之前存放为PSP。
7.1 下列程序是在3个数中找出最小的数并放入AL,在括号中填入指令使其完整。
答:(1)jl
(2)xchg al,cl
7.2 数据段如下:
db 1,2,‘abcd’
补充括号处的指令,使得程序把DA1数据区数据移到DA2数据区。
cx,( COUNT
si, ( OFFSET
DI, OFFSET
7.3 将AX和BX进行加、减、乘或除的运算,每种运算由用户从键盘上选择。程序中设置寄存器的值,或在DEBUG下设定寄存器值并在DEBUG下运行程序。
答:code segment
assume cs:code
main proc far
cmp al,311加
cmp al,322减
cmp al,333乘
cmp al,344除
ad:ADD AX,BX
su:SUB AX,BX
7.4 编写程序,从键盘接收一个小写字母,然后找出它的前导字符和后续字符,再按顺序显示这三个字母。
答:code segment
assume cs:code
cmp al,61h
cmp al,7ah
sub al,1输出前一字符
;输出当前字符
add dl,1输出后一字符
7.5 分别用LOOP循环和条件转移指令实现1+2+3+……+100,并将结果存入AX。
答:(1)code segment
assume cs:code
mov cx,99
a:add ax,bx
(2)code segment
assume cs:code
mov cx,99
a:add ax,bx
cmp bx,101
7.6 打印下面图形。
答:code segment
assume cs:code
a:mov cx,ax
b:mov ah,2
mov dl,’*’
7.7 求已知带符号数字节数组ARRAY的平均值,ARRAY的首字节单元为数组元素的个数。
data segment
5,01,12,23,45,F3
code segment
assume cs:code
mov ax,data
mov ds,ax
mov cl,array
lea si,array+1
a:add al,array[si]
7.8 编写程序,如果输入的是大写字母,则输出对应的小写字母;如果输入的是小写字母,则输出对应的大写字母;如果输入的是数字,原样输出;按回车结束。
答:code segment
assume cs:code
cmp al,30h
cmp al,3Ah
cmp al,41h
cmp al,5Bh
cmp al,61h
cmp al,7ah
sub al,20h
large: add al,20h
num: mov dl,al
exit:mov ah,4ch
7.9 编写程序,实现对无符号字数组ARRAY的6个元素从小到大排序。
dw 6,5,9,4,5,15,3首地址单元6为元素个数
assume cs:code,ds:data
ax, array[bx]
ax, array[bx+2]
xchg ax,array[bx+2]
mov array[bx],ax
7.10 数据段有两个等长的字数组,分别求出各自的元素之和,并存入元素后面的单元中,即横向相加。再求出两个数组的对应元素之和,并把和存入新数组SUM中,即纵向相加。
3, 1,0,1,?
;设简单数据,第一个为元素个数
3,3 dup (0)
;存放array1,2的和
assume cs:code,ds:data
bx, array1+2
cx, array1
;第二个数组累加
bx, array2+2
cx, array2
cx, array2
ax, array1[bx]
ax, array2[bx]
mov array3[bx],ax
7.11 编写程序,比较两个从键盘输入的字符串是否相同,如果相同,则显示 ‘YES’,如果不同,则显示发现不同的字符位置。
13,10, ‘input string1:$’
13,10, ‘input string2:$’
13,10, ‘YES!$’
13,10, ‘no match at $’
code segment
assume cs:code, ds:data,es:data
mov ax,data
lea dx,mess1
int 21qust1?
lea dx,st1
mov ah,0ah
int 21ans1
lea dx,mess2
int 21qust2?
lea dx,st2
mov ah,0ah
int 21ans2
mov cl,act1
mov dl,act2
jnz nomatch
lea si,stok1
lea di,stok2
repe cmpsb
jnz nomatch
lea dx,mess3
lea dx,mess4
sub di,offset stok2
add dl,30h
7.12 编写程序,从键盘输入一个字符串到BUFF,再输入一个字符到AL,在字符串BUFF中查找是否存在该字符,如果找到,显示发现的字符位置。
13,10, ‘input string:$’
13,10, ‘input a char:$’
13,10, ‘found at $’
13,10, ‘no found !$’
code segment
para’code’
assume cs:code, ds:data
mov ax,data
lea dx,mess1
int 21qust1?
lea dx,st1
mov ah,0ah
int 21ans1
lea dx,mess2
int 21qust2?
int 21ans2
lea di,stok1
repne scasb
lea dx,mess4
lea dx,mess3
sub di,offset stok1
and dx,0fh
add dl,30h
mov ah,4ch
7.13 编写程序,从键盘输入一个字符串到BUFF,并按相反顺序显示输出。
13,10, ‘input string:$’
13,10,’$’
code segment
assume cs:code, ds:data
start : mov ax,data
lea dx,mess1
lea dx,st1
mov ah,0ah
lea dx,mess2
mov cl,act1
mov bx, offset stok1
add bx, cx
mov dl, [bx]
7.14 编写程序,从键盘输入一个八位的二进制数,显示其十六进制数。
assume cs:code
cmp al,30h
cmp al,31h
sub al,30h
and dl,0fh
add dl,30h
cmp dl,39h
7.15 字数组ARRAY为有符号数,第一个单元为元素个数N,后面为N个元素,编写程序,求数组元素中的最大值,并把它放入MAX单元。
5,9,4,5,15,3
assume cs:code,ds:data
bx, array+2
7.16 字数组ARRAY,第一个单元为元素个数N,后面为N个元素,编写程序,把零元素从数组中清除,移动元素位置并修改第一个单元(元素个数)。
6,3,4,0,15,0,7
;此单元地址为结束标记
assume cs:code,ds:data
bx, array+2
word ptr[bx],0
di,offset loca
ax, [di+2]
di,offset loca
8.1 过程定义如下,补充括号中的指令。
assume cs:code
8.2 补充下列程序括号中的指令,使得程序对堆栈的操作全部利用程序中定义的TOS堆栈,并画出程序执行后堆栈TOS中的数据。
100 dup(?)
assume cs:code,ss:data
far ptr suba
… ;假定此处指令的地址为CS=3400h,IP=30h
8.3 主程序从键盘输入一个字符串到BUFF,再输入一个字符到AL,用子程序在字符串BUFF中查找是否存在该字符,如果找到,显示发现的字符位置。用寄存器传递要查找的字符。
答:Data segment
BUFF1 db 16,?,16 dup(?),13,10,’$’
Code segment
Assume cs:code,ds:data
Main proc far
Mov ax,data
Lea dx,BUFF1
Lea di,BUFF1+2
Mov cl,BUFF1+1
Repne scasb
BTH proc near
s:rol bx,1
and al,0fh
add al,30h
cmp al,39h
d:mov dl,al
8.4 主程序从键盘输入一个八位的二进制数,对其作求补码操作,用子程序对求补后的值以二进制形式显示。(正数的补码=输入)
答:Code segment
Assume cs:code
Main proc far
A:mov ah,1
Sub al,30h
INC输入为1
Test bx,0080h
XOR bx,00FF取反
D:Call disp
disp proc near
ls1:shl bx,1
mov dl,31h
k30: mov dl,30h
outb:mov ah,2
8.5 主程序从键盘(连续)输入两个四位的十六进制数A和B,用子程序作十六进制计算A+B,并显示计算结果(二进制)。
data segment
Code segment
Assume cs:code,ds:data
Main proc far
Call INH ;输入十六进制数到BX寄存器
Call INH ;输入十六进制数到BX寄存器
INH proc near
inchr: mov
;键盘输入
;非法输入
;输入是数字0~9
;非法输入
;非法输入
;输入是大写a~f
disp proc near
ls1: shl bx,1
mov dl,31h
l30; mov dl,30h
outb: mov ah,2
8.6 某字数组为有符号数,第一个单元为元素个数N,后面为N个元素,编写通用子程序,求数组元素中的最大值,并把它放入MAX单元。
答:MAX_p proc near
Mov di,[bx]个数地址
Mov si,[bx+2]数组地址
Mov cx,[di]
Mov di,MAX
Next:cmp di,[si]
Mov di,[si]
A: Add si,2
Mov MAX,di
MAX_p endp
8.7 设有一个数组存放学生的成绩(0 ~ 100),编制一个子程序统计0 ~ 59分、60 ~ 69分、70 ~ 79分、80 ~ 89分、90 ~ 100分的人数,并分别存放到scoreE、scoreD、score C、score B及score A单元中。编写一个主程序与之配合使用。
data segment
Array db 6,9,65,78,68,86,936为学生人数,后面为6个成绩
ScoreE db ?
scoreD db ?
scoreC db ?
scoreB db ?
scoreA db ?
Code segment
Assume cs:code,ds:data
Main proc far
Mov ax,data
Mov cl,array
Call class
Class proc near
Lea si, array
Mov bl, [si]
Mov dl, scoreA
Mov scoreA,dl
B: Mov dl, scoreB
Mov scoreB,dl
k: Mov dl, scoreC
Mov scoreC,dl
D: Mov dl, scoreD
Mov scoreD,dl
E: Mov dl, scoreE
Mov scoreE,dl
class endp
8.8 用多模块程序设计一个简单的计算器程序,实现整数的加减乘除。运算符可以为:+,-,*,/,=。
num1,num2,res
ad:far,su:far,mu:far,dv:far,el:far
cs:code,ds:data
main proc far
mov num1,bx
mov num2,bx
cmp dl,’+’
cmp dl,’-’
cmp dl,’*’
cmp dl,’/’
cmp dl,’=’
;键盘输入
;把ascii码转变为数值
;如不是数则退出
;如不是数则退出
;扩展为字
;交换寄存器
;a(n)= a(n-1)×10
;交换寄存器
;a(n)=a(n)+b(n)
;——————
num1:byte,num2:byte,res:word
mov al,num1
add al,num2
mov res,ax
mov al,num1
sub al,num2
mov res,ax
mov al,num1
mov res,ax
mov al,num1
mov res,ax
mov al,num1
cmp al,num2
mov res,0FFFFH不相等
z: mov res,0相等
8.9 从键盘输入姓名和电话号码,建立通讯录,通讯录的最大容量为9条记录,程序结束时无须保留通讯录,但程序运行时要保留通讯录信息。程序的人机界面和顺序要求如下:
(1)提示信息INPUT NAME:(调用子程序INNAME录入姓名,序号自动产生)
(2)提示信息INPUT TELEPHONE NUMBER:(调用子程序INTELE录入电话号码)
(3)提示信息INPUT 序号:(调用子程序PRINT显示某人的姓名和电话号码,如果序号不存在,则提示信息 NO THIS NUMB )。
答:Inform struc
Name db ‘??????’
‘???????????’
Inform ends
Data segment
Array struc 9 dup(&&)
Name db ‘INPUT NAME $’
‘INPUT TELEPHONE NUMBER $’
‘INPUT SEQUENCE NUMBER $’
‘NO THIS NUMB $’
code segment
assume cs:code,ds:data
main proc far
mov ax,data
call inname
call intele
call print
inname proc near
lea dx,name
mov al, size array
add bx,array
mov [bx].sn,cl
a:mov ah,1
mov [bx].name[di],al
inname endp
intele proc near
lea dx,tel
mov al, size array
add bx,array
a:mov ah,1
mov [bx].telen[di],al
intele endp
print proc near
lea dx,number
mov al, size array
add bx,array
lea dx,[bx].telen
ex: lea dx,err
print endp
9.1 宏定义:
P1,P2,P3
展开下列宏调用:
%K,DB,‘MY
1 IN1 DB ‘MY NAME’
9.2 使用宏指令,在数据段定义九条通讯录记录,宏展开后的数据段形如:
LABEL BYTE
1,‘NAME1’,‘TELE1’
2,‘NAME2’,‘TELE2’
9,‘NAME9’,‘TELE9’
X,&1,2,3,4,5,6,7,8,9&
X,’NAME&X&’,’TELE&X&’
DA1 LABEL BYTE
DATA SEGMENT
9.3 宏指令和指令的区别是什么?使用宏指令和使用子程序有何异同?宏指令的优点在哪里?
答:宏指令只在汇编时起作用,指令汇编后继续执行。宏指令与子程序的区别如下:(1)空间的区别:宏指令大于子程序,多次调用宏指令,程序长度增加。
(2)时间的区别:宏运行不需要额外的时间,子程序需要。
(3)参数的区别:宏命令可实现多个参数的直接代换,方式简单灵活;而子程序参数传递麻烦。
总之,代码不长和变元较多的功能段,使用宏命令比较合适。
9.4 在宏定义中有时需要LOCAL 伪操作,为什么?
答:在宏定义中,常常使用标号,当多次宏调用后,就会出现标号重复定义的错误。使用LOCAL伪操作,对标号说明为局部标号,这样每次调用,宏展开的标号是不同的。
9.5 宏定义在程序中的位置有何规定?宏调用是否一定放在代码段?
答:宏定义在程序中的位置没有严格要求,可以写在某一段内,也可以不在段内。
9.6 用宏指令计算S=(A+B)*K/2,其中A,B,K为常量。
macro S,A,B,K
S=(A+B)*K/2
9.7 编写宏定义,比较两个常量X和Y,如果X>Y,MAX=X,否则MAX=Y。
答:COMPARE MACRO MAX,X,Y
A: MOV MAX,X
9.8 编写非递归的宏定义,计算K的阶乘,K为变元。
答:FAC MACRO K
MOV CX,K+1
A:SUB CX,1
9.9 在数据段中定义了三个有符号数A、B、C,使用宏指令,给三个数排序,三个变量作为参数。
MACRO A,B,C
L1:CMP B,C
9.10 编写一个宏定义SCAN,完成在一个字符串中查找某个字符的工作。被查找的该字符,字符串首地址及其长度均为变元。
答: SCAN MACRO
MOV AX,SEG STREE
LEA DI,STREE
REPNE SCASB
MOV DL,’N’
YES:MOV DL,’Y’
DISP:MOV AH,2
9.11 编写宏指令COMPSS,比较2个同长度的字符串str1和str2是否相等, 2个字符串的首地址和长度为变元。写出完整程序,在数据段中写出数据定义,在代码段中写出宏定义和宏调用。并处理若相等则显示‘MATCH’,否则显示‘NOT MATCH’.
COMPSS MACRO ST1,ST2,N
LEA SI,ST1
LEA DI,ST2
REPE CMPSB
MOV DX,LEA S2
YES:MOV DX,LEA S1
DISP:MOV AH,9
DATA SEGMENT
STR1 DB ‘’
‘MATCH$’
‘NOT MATCH$’
EXT SEGMENT
CODE SEGMENT
MAIN PROC FAR
MOV AX,DATA
MOV AX,EXT
MOV NUM, LENGTH STR1
COMPSS STR1,STR2, NUM
9.12 编写宏定义程序,可以对任意字数组求元素之和,数组名称、元素个数和结果存放单元为宏定义的哑元。
答:ADS MACRO ARRAY,N,SUM
Lea di,ARRAY
Ad:add ax,[di][si]
Mov SUM,ax
9.13 编写一个宏库文件,其中包括系统功能调用(INT 21H)的00~0A号功能调用。并通过宏调用实现以下各项功能:从键盘输入一个字符串到BUFF;再输入一个单字符,然后在字符串BUFF中查找是否存在该字符;如果找到,显示发现的字符位置。
答: 宏库文件sysmacro.mac文件定义如下:
INPUT MACRO
OUTPUT MACRO CHA
MOV DL,CHA
INPUTN MACRO
OUTSTR MACRO STREE
MOV DX,OFFSET STREE
INBUFF MACRO BUFF
MOV DX,OFFSET BUFF
MOV AH,0AH
WFILE MACRO FIL,NUM,COUNT
MOV DX,OFFSET FIL
MOV BX,NUM
MOV CX,COUNT
MOV AH,40H
EXIT MACRO
MOV AH,4CH
调用:include sysmacro.mac
Data segment
BUFF1 db 16,?,16 dup(?),13,10,’$’
Code segment
Assume cs:code,ds:data
Main proc far
Mov ax,data
INBUFF BUFF1
Lea di,BUFF1+2
Mov cl,BUFF1+1
Repne scasb
BTH proc near
s:rol bx,1
and al,0fh
add al,30h
cmp al,39h
d:OUTPUT al
10.1 I/O数据传送控制方式有哪几种?
答:无条件传送、查询传送、中断传送、直接存储器传送。
10.2 什么是I/O接口?什么是端口?接口部件在计算机主机一方还是在外设一方?
答:I/O接口是INPUT/OUTPUT指输入/输出设备接口。CPU与外部设备的连接和数据交换都需要通过接口设备来实现,被称为I/O接口。计算机主机的CPU通过访问这些寄存器来实现与外部设备交换数据。把接口中的这些寄存器称为端口(PORT)。这些寄存器并不是在外部设备一方,而是属于计算机主机。
10.3 通过端口传递哪三种信息?
答:CPU与I/O设备的通信有三种信息,即控制信息、状态信息和数据信息。
10.4 根据以下要求写出输入输出指令:
(1) 读61H端口
(2) 写20H端口
(3) 读3F8H端口
(4) 写3F9H端口
答:(1) IN al,61h
(2) OUT 20h,al
(3)mov dx,3F8H
(4)mov dx,3F9H
10.5 举例说明何为中断类型号,何为中断向量,何为中断向量表。对于INT 8指令,中断向量存放的内存地址是多少?
答:在实际的系统中,中断源有多个,需要给每个中断源编一个号,以便于识别。在执行软件中断指令INT n时,n就是中断类型号。我们把中断处理程序的起始地址称为中断向量。在存储器的最低1KB(地址从0000~3FFH)集中存放256种中断类型的中断向量,每个中断向量为四个字节,其中前两个字节是偏移地址,后两个字节是段地址。这个集中存放中断向量的存储区称为中断向量表。
INT 8对应中断向量存放的内存地址是00020H
10.6 举例说明何为内中断,何为外中断,何为硬件中断,何为可屏蔽中断。
答:内中断:中断指令INT
外中断:也称为硬件中断,如电源故障。
可屏蔽中断:如定时器。
10.7 何为开中断和关中断。关中断情况下,内中断能否被响应?不可屏蔽中断能否被响应?可屏蔽中断能否被响应?
答:所谓开中断,是指程序在运行中,包括中断程序执行中,允许响应其他中断请求,再转去运行中断服务程序。关中断则是不允许系统打断连续的运行。内中断可以响应,不可屏蔽中断可以被相应。可屏蔽中断不能被响应。
10.8 写出仅使定时器、键盘、硬盘、打印机不被屏蔽,并开中断的指令序列。
答: Mov al,
OUT 21h,al
10.9 列出INT指令执行的操作,列出CPU响应外部中断时所做的工作。
答:中断请求,中断优先级判定,中断响应,中断处理,中断返回。
CPU响应外部中断自动完成下列工作:
1.取中断内型号N;
2.标志寄存器入栈;
3.代码段寄存器和指令指针入栈;
4.禁止硬件中断和单步中断;
5.在中断向量表中的N*4开始的单元取两个字分别送IP和CS,获取
中断处理程序入口地址。
10.10 中断处理程序中通常要做哪些工作?中断处理程序中是否一定要开中断?如果有开中断指令,意味着什么?
答:中断处理程序一开始可以根据需要开中断,以允许中断嵌套。用入栈指令把中断处理程序中将要用到的寄存器内容压入堆栈,以保护现场,待中断处理完毕,退出中断处理程序之前再把寄存器的内容从堆栈中弹出,从而恢复现场。
10.11 为什么说程序员应尽可能使用层次较高的DOS功能,其次才是使用BIOS功能,最后才是使用输入输出指令。
答:因为用户通过调用DOS或者BIOS例行程序来实现对外设的访问,可以降低程序设计的复杂程度,缩短开发周期。BIOS存放在机器的ROM中,层次比DOS低,更接近硬件;DOS功能调用是操作系统DOS的一个组成部分,开机时从外存装入内存,DOS可以完成比BIOS更高级的功能,因此DOS操作比使用相应功能的BIOS操作更简易,而且DOS对硬件的依赖性更少。
10.12 编写程序段,使用INT 1CH指令调用首地址为MYINT的中断处理程序。用完后恢复INT 1CH指令的原有功能。
Code segment
Assume cs:code
Mov al,1ch
Mov ah,35h
Mov dx,offset MYINT
Mov ax,seg MYINT
Mov al,1ch
Mov ah,25h
;使用中断程序
Mov al,1ch
Mov ah,25h
Mov ah,4ch
习题11 (基本可在书中找到参考,省略)
没有更多推荐了,

我要回帖

更多关于 假设一个有n个定义 的文章

 

随机推荐