汇编语言王爽第二版课后答案_第1页
汇编语言王爽第二版课后答案_第2页
汇编语言王爽第二版课后答案_第3页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、第一章基础知识检测点1.1(第8页)(1) 13 1024,0,1023(3)8192,1024(4)2A30,2A20,2A10(5)64,1,16,4(6)1,1,2,2,4(7)512,256(8)二进制注意:1. 第4题中的符号'A'指求幂运算(如:2A30指2的30次方)第二章寄存器(CPU工作原理)检测点2.1(第18页)(1)写岀每条汇编指令执行后相关寄存器中的值。第一空:F4A3H第二空:31A3H第三空:3123H第四空:6246H第五空:826CH第六空:6246H第七空:826CH第八空:04D8H第九空:0482H第十空:6C82H第 一空:D882H第

2、十二空:D888H第十三空:D810H第十四空:6246H 只能使用目前学过的汇编指令,最多使用4条指令,编程计算2的4次方。解答如下:mov ax,2add ax,axadd ax,axadd ax,ax检测点2.2(第23页)(1)00010H,1000FH 1001H,2000H第2题说明:因为段的起始地址要为 16的倍数。所以当段地址小于1001H或大于2000H时CPU都无法寻到。检测点2.3(第33页)答:CPU修改了 4次IP的值。情况如下:第1次:执行完 mov ax,bx后第2次:执行完sub ax,ax后第3次:读入jmp ax后第4次:执行完jmp ax后最后IP的值为0

3、实验1查看CPU和存,用机器指令和汇编指 令编程(第33页)1. 预备知识:Debug的使用此部分略2. 实验任务(第43页)(1)此部分略此部分略通过DEBUG中的D命令查看到主板的生产日期以 月、日、年,分隔符为'/'的格式存储在存 ffff:0005ffff:000C(共8个字节单元中)处。此生产日期不能被改变,因为其具有只读属性。通过向存中的显存写入数据,使计算机根据写入的 数据进行ASCII转换,并将转换后且可打印的字符 输岀到屏幕上。注:关于显存的详细讨论不在此题围第三章 寄存器(存访问)检测点3.1(第52页)(1)(题目:略)第一空:2662H第二空:E626H

4、第三空:E626H第四空:2662H第五空:D6E6H第六空:FD48H第七空:2C14H第八空:0000H第九空:00E6H第十空:0000H第 一空:0026H第十二空:000CH提示:此题可在DEBUGS利用E命令在本机上按照 题目中所给出的存单元及其数据进行相应地修改, 然后再用A命令进行写入(题目中所给出的)相应的 汇编指令,最后再进行 T命令进行逐步执行,以查 看相应结果。指令序列寄存器CSIPDSAXBX初始值2000卜00001000卜00mov ax,6622h2000卜00031000卜6622H0000jmp OffO:O1OO1000卜00001000卜6622H000

5、0mov ax,2000h1000卜00031000卜2000H0000mov ds,ax1000卜00052000卜2000H0000mov ax,00081000卜00082000卜C389卜10000mov ax,00021000卜000B2000卜EA66H00002.写出CPU执行每条指令后,CS IP和相关寄存器 中的数值。3.再次体会:数据和程序有区别吗?如何确定 存中的信息哪些是数据,哪些是程序?答:(略)2. 实验任务(1)使用Debug,将下面的程序段写入存,逐条执行, 根据指令执行后的实际运行情况填空。从第一空开始依次如下:1. 指令序列如下: mov ax,6622h

6、jmp OffO:O1OO mov ax,2OOOh mov ds,axmov ax,0008 mov ax,OOO2检测点3.2(第66页)mov ax,2000Hmov ss,axmov sp,1OHmov ax,1OOOHmov ss,axmov sp,OH实验2用机器指令和汇编指令编程(第70页)1. 预备知识:Debug的使用 此部分略ax=5BEAax=5CCAbx=30F0bx=6029sp=FE 220FE 5CCAsp=FC 220FC 6029sp=FE 6029sp=100H 5CCAsp=FE 220FE 30F0sp=FC 220FC 2E39说明:此题可能因机子软、

7、硬件环境不同而导致答 案不一致!(2)仔细观察图3.19的实验过程,然后分析:为什么2000:02000:f 中的容会发生改变?答:因为用T指令进行调试时,会产生中断。而为 了保护现场,CPU则先将标志寄存器进栈、再把当 前CS的值进栈,最后将IP的值进栈。关于中断 的详细容的讨论不在此题围 第五章BX和loop指令实验4 BX和loop的使用(第113页)(1)编程,向存0:2000:23F依次传送数据 063(3FH)。程序如下:assume cs:codesgcodesg segmentmov ax,0020hmov ds,axmov bx,0mov dl,0mov cx,40hs:mo

8、v bx,dlinc dlinc bxloop sint 21hcodesg endsend编程,向存0:2000:23F依次传送数据063(3FH),程序中只能使用9条指令,9条指令中包括“ mov ax,4c00h ”和 “int 21h ”。程序如下:assume cs:codesgcodesg segmentmov ax,0020hmov ds,axmov bl,0mov cx,40hs:mov bx,blinc blloop smov ax,4c00hint 21hcodesg endsend 下面的程序的功能是将“ mov ax,4c00h ”之前 的指令复制到存0:200处,补全

9、程序。上机调试, 跟踪运行结果。assume cs:codecode segmentmov ax, code ;code 为所填写的数据mov ds,axmov ax,0020hmov bx,0mov cx, 18h ;18h为所填写的数据s: mov al,bxmov es:bx,alinc bxloop smov ax,4c00hint 21hcode endsend提示:1. 因为题目的要把代码段的指令当作数据,复制到目的地址。所以,源数据段 ds和代码段cs相同, 通过 mov ax,code/mov ds,ax ('/'符号是指两条指令的分隔)来设置源数据段。2. 可

10、以先假设要复制8位1h0ffh数据(因为我们肉眼就可以看出此程序的长度不可能大于 0ffh个 字节)的字节数(如:10h),把程序补全,以便通过 编译。这时我们以准确的第一空所填容 code与假 想的第二空容10h将程序补充完整并将其编译、连 接、运行,接着进行 DEBUG在DEBUGS我们可用 R命令查看CX的值,这时我们可以看到CX的值为1D,由此我们可以算岀该程序的长度1Dh-5h=18h,之所以减5是为了满足题目的要求 (因为mov ax,4c00h/int 21h 这两条指令的长度等 于5)第六章包含多个段的程序检测点6.1(第119页)(1)assume cs:codesgcode

11、sg segme ntdw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hmov ds,axmov bx,0mov cx,8s:mov ax,bxmov cs:bx,ax ;此条指令为所填指令add bx,2loop smov ax,4c00hint 21hcodesg endsend startassume cs:codesgcodesg segme ntdw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdw 0,0,0,0,0start:mov ax, cs ;cs为所填第一空mov ss,axm

12、ov sp,1ah ;此条指令为所填第二空mov ax,0mov ds,axmov bx,0s:push bxpop cs:bx ;此条指令为所填第三空add bx,2loop smov ax,4c00hint 21hcodesg endsend start实验5编写、调试具有多个段的程序(第123页)1. 保持不变2. <考虑不同机子环境不同,答案无法统一>3. X-2,X-11. 保持不变2. <考虑不同机子环境不同,答案无法统一>3. X-2,X-14. (N/16+1)*16 说明:N/16只取整数部分1. 保持不变2. <考虑不同机子环境不同,答案无法统

13、一>3. X+3,X+4loop si答:第3个仍然可以正确执行。因为如果把 end指令后的标号start去掉后,编译器便会 顺序执行程序。换句话说:当未给编译器预先 的通知,要求其从哪开始执行程序时,编译器就自动以至上向下的顺序进行编译执行源 程序。(5)完整程序如下:assume cs:codea segme ntdb 1,2,3,4,5,6,7,8a endsb segme ntdb 1,2,3,4,5,6,7,8b endsc segme ntdb 0,0,0,0,0,0,0,0c en dscode segme ntsta rt:mov ax,amov es,axmov ax,

14、cmov ds,axmov bx,0mov cx,8s1:mov ax,es:bxadd bx,axmov ax,bmov es,ax mov ds,ax mov bx,0 mov cx,8s2:mov ax,es:bx add bx,ax add bx,2 loop s2 mov ax,4c00h int 21h code ends end start(6)完整程序如下: assume cs:code a segme ntdw 1,2,3,4,5,6,7,8 a en ds b segme ntdw 0,0,0,0,0,0,0,0 b en ds code segme nt sta rt:a

15、dd bx,2mov ss,axmov sp,10hdb '1. display 'mov ax,adb 2 brows'mov ds,axdb 3 replace 'mov bx,0db '4. modify'datasg endsmov cx,8codesg segme nts:push bxsta rt:add bx,2mov ax,stacksgloop smov ss,axmov ax,4c00hmov sp,16int 21hmov ax,datasgcode endsmov ds,axend startmov bx,0第七章更灵活的

16、定位存地址的方法mov cx,4实验6实践课程中的程序(第147页)s:;夕卜循环push cx编程:完成问题中的程序。mov si,3问题7.9完整程序如下:mov cx,4s0:;循环assume cs:codesg,ss:stacksg,ds:datasgmov al,bx+siand al,11011111bstacksg segme ntmov bx+si,aldw 0,0,0,0,0,0,0,0inc sistacksg endsloop s0add bx,16datasg segme ntpop cxdw 11542,14430,45257,17800loop smov ax,4

17、c00h int 21h codesg ends end start第八章数据处理的两个基本问题实验7寻址方式在结构化数据访问中的应用(第160页)完整程序如下:assume cs:codesg,ds:data,es:tabledata segme ntdb'1975','1976','1977','1978','1979','1980','1981','1982','1983'db'1984','1985','

18、1986','1987','1988','1989','1990','1991','1992'db '1993','1994','1995'以上是表示21年的21个字符串dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd345980,590827,803530,1183000,1843000,27 59000,3753000,4649000,5937000;以上是

19、表示21年公司总收的21个dword型数据dw3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8226;以上是表示21年公司雇员人数的21个word型数据data endstable segme ntdb 21 dup('year summ ne ?')table endscodesg segme ntsta rt:mov ax,datamov ds,axmov ax,tablemov es,axmov bx,0mov si,0mov di,0mov cx,21s:;进入循环mov al,bxmov es

20、:di,almov al,bx+1mov es:di+1,almov al,bx+2mov es:di+2,al mov es:di+3,al;以上8句的作用是存放年份mov ax,54hbx;第一个'年收入的段基址为54Hmov dx,56hbxmov es:5hdi,axmov es:7hdi,dx;以上4句的作用是存放公司总收入mov ax,0A8hsi;第一个'人数'的段基址为0A8Hmov es:0Ahdi,ax;以上2句是存放公司的人数mov ax,54hbxdiv word ptr ds:0A8hsimov es:0dhdi,ax;以上3句是存放人均收入a

21、dd bx,4add si,2add di,16;以上3句是为下一次循环时存放数据做准备;3个寄存器递增的速度决定了所要存取的数据的位置的偏移地址loop s ;跳到标号s处mov ax,4c00hint 21h程序说明:此程序虽然可以达到预期效果(读者可以自行调试验证),但实现方法比较简单, 读者有兴趣的话可以寻找一种 更具结构化的 设计方法来完成。第九章转移指令的原理检测点9.1(第170页) 若要使jmp指令执行后,CS:IP指向程序 的第一条指令,在 data段中应该定义哪些数 据?完整程序如下:assume cs:code,ds:datadata segme ntdb 0,0,0da

22、ta endscode segme ntstart:mov ax,datamov ds,axmov bx,0jmp word ptr bx+1;段间接转移code endsend start;解题理由:为了使IP的值经跳转后变为0,则需保证ds:bx+1处的字型单元数据为0000H,;所以定义3个字节型数据0就符合“应该” 的要求(2)补全程序,使jmp指令执行后,CS:IP指 向程序的第一条指令。codesg ends end start完整程序如下:assume cs:code,ds:datadata segme ntdd 12345678hdata endscode segme ntst

23、art:mov ax,datamov ds,axmov bx,0mov bx, bx ;源操作数bx为所填容mov bx+2, cs ;源操作数cs为所填容jmp dword ptr ds:0code endsend start 用Debug查看存,结果如下:2000:1000 BE 00 06 00 00 00 则此时,CPU执行指令:mov ax,2000Hmov es,axjmp dword ptr es:1000H后,(CS)=? , (IP)=?提示:为了使本机环境2000:1000至2000:1005 中的数据与题目中所给岀的数据 一致,可以通过编写程序来完成,完整程序如下:ass

24、ume cs:codecode segme ntsta rt:mov ax,2000hmov ds,axmov bx,1000hmov word ptr bx.0,0BEHmov word ptr bx.2,6hmov word ptr bx.4,0;运行完上6句则使2000:1000-2000:1005中的数据依次为:BE,00,06,00,00,00;以上6句则按题目中的数据进行初始 化,以便使运行环境符合题目要求;mov ax,2000hmov es,axjmp dword ptr es:1000hcode endsend start经上机调试得岀:CS=0006H,IP=00BEH检测

25、点9.2(第172页)从标号s处开始所要填写的四条指令依次如下:第一条指令:mov cl,bx第二条指令:mov ch,0第三条指令:jcxz ok第四条指令:inc bx检测点9.3(第173页)实验8分析一个奇怪的程序(第174页)分析下面的程序,在运行前思考:以正确返回吗?运行后再思考:为什么是这种结果?通过这个程序加深对相关容的理解。assume cs:codesgcodesg segme ntmov ax,4c00hint 21hsta rt:mov ax,0s:nopnopmov di,offset smov si,offset s2mov ax,cs:simov cs:di,ax

26、s0:jmp short ss1:mov ax,0int 21hmov ax,0s2:jmp short s1这个程序可补全程序,利用loop指令,实现在存 2000H 段中查找第一个值为0的byte,找到后,将它的偏移地址存储在dx中。assume cs:codecode segme ntstart:mov ax,2000hmov ds,axmov bx,0s:mov cl,bxmov ch,0inc cx ;此条指令为题目要求补全的指令inc bxloopok:dec bxmov dx,bxmov ax,4c00hint 21hcode endsend start解答提醒:此题可用假设法来

27、完成(比如设 2000:0000 至 2000:0003 的容依次为:1E 06 000A)。此题要注意loop指令的使用规则,同时 要注意区别存单元与存单元中的数据(或 容)的不同。nop实验9根据材料编程(第175页)codesg endsend start程序可以正常返回。详细分析:在此题中较为深入地考察了 段直接短转移形如:jmp short 标号的概念。我们知道程序中:mov di,offset smov si,offset s2mov ax,cs:simov cs:di,ax四条指令的作用是将标号s2处的一条指令复制到标号s处。这时我们应该关心所复制的语 句"jmp sh

28、ort s1"对程序的影响:我们知道在段直接短转移指令所对应的机器码中,并不包含转移的目的地址,而包含的是转移的位移量(如对此概念还不太熟悉,请查看书中第 167 页的容)。也就是说,在源程序的编译过程中, 编译器遇到段直接短转移形如:jmp short 标号时就会自动算岀其要跳转的位移量,以 便程序在执行段直接短转移的指令时就根 据位移量进行(向前或向后)跳转。通过调试中 的U命令我们可以看到指令s2:jmp shorts1'所对应的机器码是 EBF6, F6h(-10d的补码) 就是跳转的位移量此位移量也可由指令 's2:jmp short s1'处的偏移

29、地址 18h减去指令's2:jmp short s1'后一个字节的偏移地址22h得岀。这时我们就知道了其实复制到标 号s处的指令所对应的机器码就是EBF6(刚好取代两个nop所对应的机器码),它的作用就 是将当前IP向前移动10个字节。当程序执行 标号SO处的指令后,程序便跳到标号s处接着执行标号s处的指令。s处的指令的作用是 向前跳10字节,于是便跳到了代码中的第一 条指令,继续执行后便实现了程序的正常返 回。assume cs:code,ds:data,ss:stackdata segme ntdb 'welcome to mas m!'定义要显示的字符串(

30、共16字节)db 02h,24h,71h;定义三种颜色属性data endsstack segme ntdw 8 dup(0)stack endscode segme ntsta rt:mov ax,datamov ds,axmov ax,stackmov ss,axmov sp,10hmov bx,0mov di,0mov ax ,0b872h; 算岀屏幕第12行中间的显存的段起始位置放入ax中mov cx,3 ;外循环为3次,因为 要显示三个字符串s3:push cx ;三个进栈操作为外循环s3保存相关寄存器的值push di注意:此程序不会也不可能执行标号s1处后的指令。push ax

31、;以防止它们的值在循环中被破坏mov es,ax ;此时es为屏幕第12行中间的显存的段起始位置mov si,0mov di,0mov cx,1Oh ; 循环为10h次,因 为一个字符串中含10h个字节s1: mov al,ds:bx+simov es:bx+di,alinc siadd di,2loop si;此循环实现偶地址中存放字符mov si,1 ;si的值设为1,从而为在显存奇地址中存放字符的颜色属性做准备pop di ; 将di的值恢复成进 入循环之前的时候的值mov al,ds:10hbx+di;取颜色属性源OP寻址方式:相对基址变址mov cx,10h ;第二个循环也为10h次

32、s2: mov es:bx+si,aladd si,2loop s2; 此循环实现奇地址中存放字符的颜色属性; 以下4句为下一趟外循环做准备inc dipop axadd ax,0ah址设为当前行的下一行;将显存的段起始地;当于在偏移地址中加了在段地址中加0ah,相0a0h(=160d)pop cxloop s3t mov ax,4c00hint 21hcode endsend start第十章call 和ret指令检测点10.1(第179页)第一空:1000h第二空:0提示:此题等效于把CS的值改为1000H,把IP的值改为0。因为retf指令进行的操作是 先将IP出栈,再将CS出栈,所以在

33、进栈时应 当进行相反的操作。检测点10.2(第181页)ax=6提示:在执行指令"call s"时,IP的值变为6, 接着进栈。此时程序直接执行指令 "s:pop ax",这就等于把栈中IP的值放入ax中。所 以答案为6。关于更多的call指令的问题请 看附注中的“错误指出”中的第 6条。检测点10.3(第181页)ax=1010提示:1. 寄存器中存放的值为16进制数2. 关于更多的call指令的问题请看附注中的 “错误指出”中的第 6条。检测点10.4(第182页)ax=OOOBmov ax,datamov cl,0cah ;cl中存放颜色属性(0c

34、ah为红底高亮闪烁绿色属性)提示:关于更多的 call指令的问题请看附注 中的“错误指出”中的第 6条。检测点10.5(第183页)答:ax中的数值为3提示:不能利用T命令进行调试,贝U改用U和 G命令来调试。可用U命令先查看指令"movax,4c00h"处的偏移地址,然后用G命令直接执行到指令"mov ax,4c00h"的偏移地址处。ax=1bx=0提示:关于更多的 call指令的问题请看附注 中的“错误指出”中的第 6条。实验10编写子程序(第194页)1.显示子程序完整程序如下:data segme ntdb 'Welcome to mas

35、m!',0data ends code segme ntassume cs:code,ds:datastart:mov dh,1;dh装行号(围:1-25)mov dl,1;dl装列号(围:1-80)注:每超过80等于行号自动加1mov ds,axmov si,0call show_strmov ax,4c00hint 21hshow_str:;显示字符串的子程序定义开始push cxpush simov al,0A0hdec dh ;行号在显存中下标从0开始,所以减1mul dhmov bx,axmov al,2mul dlsub ax,2;列号在显存中下标从0开始,又因为偶字节存放字符,所以减2add bx,ax;此时bx中存放的是行与列号的偏移地址mov ax,0B800hmov es,ax ;es中存放的是显存的第0页(共0-7页)的起始的段地址mov di,0mov al,clmov ch,0s:mov cl,ds:sijcxz okmov es:bx+di,cl ;偶地址存放字符mov es:bx+di+1,al ;

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论