1、汇编语言王爽第二版课后答案第一章基础知识检测点1.1(第8页)13(2) 1024,0,1023(3) 8192,1024(4) 2A30,2A20,2A10(5) 64,1,16,4(6) 1,1,2,2,4 512,256(8)二进制注意:1.第4题中的符号A指求籍运算(如:2A30指2的30次方)第二章寄存器(CPU工作原理)检测点2.1(第18页)(1)写出每条汇编指令执行后相关寄存器中的值。第一空:F4A3H第二空:31A3H第三空:3123H第四空:6246H第五空:826CH第六空:6246H第七空:826CH第八空:04D8H第九空:0482H第十空:6C82H第 一空:D88
2、2H第十二空: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时CPUK无法寻到。检测点2.3(第33页)答:CPU修改了 4次IP的值。情况如下:第1次:执行完 mov ax,bx后第2次:执行完sub ax,ax后第3次:读入jmp ax后第4次:执行完jmp ax后最后I
3、P的值为0实验1查看CPU和存,用机器指令和汇编指 令编程(第33页)1.预备知识:Debug的使用此部分略2.实验任务(第43页)(1)此部分略此部分略通过DEBUC的D命令查看到主板的生产日期以 月、日、年,分隔符为/的格式存储在存 ffff:0005ffff:000C( 共8个字节单元中)处。此生产日期不能被改变,因为其具有只读属性。通过向存中的显存写入数据,使计算机根据写入的 数据进行ASCII转换,并将转换后且可打印的字符 输出到屏幕上。点i:关于显存的详细讨论不在此 题围第三章 寄存器(存访问)检测点3.1(第52页)(1)(题目:略)第一空:2662H第二空:E626H第三空:E
4、626H第四空:2662H第五空:D6E6H第六空:FD48H第七空:2C14H第八空:0000H第九空:00E6H第十空:0000H第 一空:0026H 第十二空:000CH提示:此题可在DEBU映利用E命令在本机上按照 题目中所给出的存单元及其数据进行相应地修改, 然后再用A命令进行写入(题目中所给出的)相应的 汇编指令,最后再进行 T命令进行逐步执行,以查 看相应结果。1.指令序列如下:mov ax,6622hjmp 0ff0:0100mov ax,2000hmov ds,axmov ax,0008mov ax,00022. 写出CPU执行每条指令后,CS IP和相关寄存器 中的数值。a
5、x=5BEAax=5CCAbx=30F0bx=6029sp=FE 220FE 5CCAsp=FC 220FC 6029sp=FE 6029sp=100H 5CCAsp=FE 220FE 30F0sp=FC 220FC 2E39说明:此题可能因机子软、硬件环境不同而导致答 案不一致!指令序列寄存器CSIPDSAXBX初始值2000H00001000H00mov ax,6622h2000H00031000H6622H0000jmp 0ff0:01001000H00001000H6622H0000mov ax,2000h1000H00031000H2000H0000mov ds,ax1000H000
6、52000H2000H0000mov ax,00081000H00082000HC389H10000mov ax,00021000H000B2000HEA66H00003.再次体会:数据和程序有区别吗?如何确定 存中的信息哪些是数据,哪些是程序?答:(略)检测点3.2(第66页)(1)mov ax,2000Hmov ss,axmov sp,10Hmov ax,1000Hmov ss,axmov sp,0H实验2用机器指令和汇编指令编程 (第70页)1.预备知识:Debug的使用此部分略2.实验任务(1)使用Debug,将下面的程序段写入存,逐条执行, 根据指令执行后的实际运行情况填空。从第一空
7、开始依次如下:(2)仔细观察图3.19的实验过程,然后分析:为什 么2000:02000:f 中的容会发生改变?答:因为用T指令进行调试时,会产生中断。而为 了保护现场,CPU则先将标志寄存器进栈、再把1 前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: mov bx,dl
8、inc dlinc bxloop smov ax,4c00hcodesg 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(3)下面的程序的功能是将mov ax,4c00h ”之前 的指令复制到存0:200处,补全程序
9、。上机调试, 跟踪运行结果。assume cs:codecode segmentmov ax, code ;code 为所填写的数据mov ds,axmov ax,0020hmov 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.可以先假设要复制8位1h0ffh数据(
10、因为我们肉眼就可以看出此程序的长度不可能大于 0ffh个 字节)的字节数(如:10h),把程序补全,以便通过 编译。这时我们以准确的第一空所填容 code与假 想的第二空容10h将程序补充完整并将其编译、连 接、运行,接着进行 DEBUG在DEBUGS我们可用 R命令查看CX的值,这时我们可以看到 CX的值为1D,由此我们可以算出该程序的长度 1Dh-5h=18h,之所以减5是为了满足题目的要求 (因为mov ax,4c00h/int 21h 这两条指令的长度等于5)第六章包含多个段的程序检测点6.1(第119页)assume cs:codesgcodesg segmentdw0123h,04
11、56h,0789h,0abch,0defh,0fedh,0cb ah,0987hmov ds,axmov bx,0mov cx,8s: mov ax,bxmov cs:bx,ax ; 此条指令为所填指令add bx,2loop smov ax,4c00hint 21hcodesg endsend startassume cs:codesgcodesg segmentdw0123h,0456h,0789h,0abch,0defh,0fedh,0cbah,0987hdw 0,0,0,0,0start:mov ax, cs ;cs 为所填第一空mov ss,axmov sp,1ah ; 此条指令为所
12、填第二空mov ax,0mov ds,axmov bx,0mov cx,8s:push bxpop cs:bx ; 此条指令为所填第三空add bx,2loop smov ax,4c00hint 21hcodesg endsend start实验5编写、调试具有多个段的程序 (第123页)1.保持不变2.3.X-2 , X-1(2)1.保持不变2.3.X-2 , X-14.(N/16+1)*16 说明:N/16只取整数部分1.保持不变2.3.X+3 , X+4答:第3个仍然可以正确执行。因为如果把 end指令后的标号start去掉后,编译器便会 顺序执行程序。换句话说:当未给编译器预先 的通知
13、,要求其从哪开始执行程序时, 编译器就自动以至上向下的顺序进行编译执行源 程序。(5)完整程序如下:assume cs:codea segmentdb 1,2,3,4,5,6,7,8a endsb segmentdb 1,2,3,4,5,6,7,8b endsc segmentdb 0,0,0,0,0,0,0,0c endscode segmentstart:mov ax,amov es,axmov ax,cmov ds,axmov bx,0mov cx,8s1:mov ax,es:bxadd bx,axadd bx,2loop s1mov ax,bmov es,axmov ds,axmov
14、bx,0mov cx,8s2:mov ax,es:bxadd bx,axadd bx,2loop s2mov ax,4c00hint 21hcode endsend start(6)完整程序如下:assume cs:codea segmentdw 1,2,3,4,5,6,7,8a endsb segmentdw 0,0,0,0,0,0,0,0b endscode segmentstart:mov ax,bmov sp,10hmov ax,amov ds,axmov bx,0mov cx,8s: push bxadd bx,2loop smov ax,4c00hint 21hcode endse
15、nd start第七章更灵活的定位存地址的方法实验6实践课程中的程序(第147页)编程:完成问题中的程序。问题7.9完整程序如下:assume cs:codesg,ss:stacksg,ds:datasgstacksg segmentdw 0,0,0,0,0,0,0,0stacksg endsdb 1. display db 2. brows db 3. replace db 4. modify datasg endscodesg segmentstart:mov ax,stacksgmov ss,axmov sp,16mov ax,datasgmov ds,axmov bx,0mov cx,
16、4s:;夕卜循环push cxmov si,3mov cx,4s0:; 循环mov al,bx+siand al,11011111bmov bx+si,alinc siloop s0add bx,16datasg segmentpop cxdw 11542,14430,45257,17800loop smov ax,4c00hint 21hcodesg endsend start第八章数据处理的两个基本问题实验7寻址方式在结构化数据访问中的应用(第160页)完整程序如下:assume cs:codesg,ds:data,es:tabledata segmentdb1975,1976,1977,
17、1978,1979,1980,1981,1982,1983db1984,1985,1986,1987,1988,1989,1990,1991,1992db 1993,1994,1995; 以上是表示21年的21个字符串dd16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197514dd345980,590827,803530,1183000,1843000,2759000,3753000,4649000,5937000; 以上是表示21年公司总收的21个dword型数据dw3,7,9,13,28,38,130,220,476,77
18、8,1001,1442,2258,2793,4037,5635,8226; 以上是表示21年公司雇员人数的21个word型数据data endstable segmentdb 21 dup(year summ ne ?)table endscodesg segmentstart:mov ax,datamov ds,axmov ax,tablemov es,axmov bx,0mov si,0mov di,0mov cx,21s:; 进入循环mov al,bxmov es:di,almov al,bx+1mov es:di+1,almov al,bx+2mov es:di+2,almov al,
19、bx+3mov 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句是存放人均收入add bx,4add si,2add di,16; 以上3句是为下一次循环时存放数据做准备;3 个寄存器递增的速度决定了所要
20、存取的数据的位置的偏移地址loop s ; 跳到标号s处mov ax,4c00hint 21hcodesg ends程序说明:此程序虽然可以达到预期效果 (读者可以自行调试验证),但实现方法比较简单, 读者有兴趣的话可以寻找一种 更具结构化的 设计方法来完成。第九章转移指令的原理检测点9.1(第170页) 若要使jmp指令执行后,CS:IP指向程序 的第一条指令,在 data中中应该定义哪些数 据?完整程序如下:assume cs:code,ds:datadata segmentdb 0,0,0data endscode segmentstart: mov ax,datamov ds,axmo
21、v bx,0jmp word ptr bx+1; 段间接转移code endsend start;解题理由:为了使IP的值经跳转后变为 0,则需保证ds:bx+1处的字型单元数据为 0000H,;所以定义3个字节型数据0就符合“应该” 的要求(2)补全程序,使jmp指令执行后,CS:IP指 向程序的第一条指令。end start完整程序如下:assume cs:code,ds:datadata segmentdd 12345678hdata endscode segmentstart: mov ax,datamov ds,axmov bx,0mov bx, bx ; 源操作数bx为所填容mov
22、 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 中的数据与题目中所给出的数据一致,可以通过编写程序来完成, 完整程序如下:assume cs:codecode segmentstart:mov ax,2000hmov ds,axmov b
23、x,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检测点9.2(第172页)从标号s处开始所要填写的四条指令依次如 下:第一条指令: mov cl,bx第二条指令: m
24、ov ch,0第三条指令:jcxz ok第四条指令:inc bx检测点9.3(第173页)补全程序,利用loop指令,实现在存 2000H 段中查找第一个值为 0的byte ,找到后,将它的偏移地址存储在 dx中。assume cs:codecode segmentstart:mov ax,2000hmov ds,axmov bx,0s:mov cl,bxmov ch,0inc cx ;此条指令为题 目要求补全的指令inc bxloopok:dec bxmov dx,bxmov ax,4c00hint 21hcode endsend start解答提醒:此题可用假设法来完成(比如设 2000:
25、0000 至 2000:0003 的容依次为:1E 06 00 0A)。此题要注意loop指令的使用规则,同时 要注意区别存单元与存单元中的数据(或 容)的不同。实验8分析一个奇怪的程序(第174页)分析下面的程序, 在运行前思考:这个程序可以正确返回吗?运行后再思考:为什么是这种结果?通过这个程序加深对相关容的理解。assume cs:codesgcodesg segmentmov ax,4c00hint 21hstart:mov ax,0s:nopnopmov di,offset smov si,offset s2mov ax,cs:simov cs:di,axs0:jmp short s
26、s1:mov ax,0int 21hmov ax,0s2:jmp short s1nop实验9根据材料编程(第175页)codesg endsend start程序可以正常返回。详细分析:在此题中较为深入地考察了 段直接短转移 形如:jmp short 标号的概念。我们知道程序中:mov di,offset smov si,offset s2mov ax,cs:simov cs:di,ax四条指令的作用是将标号 s2处的一条指令复制到标号s处。这时我们应该关心所复制的语 句jmp short s1对程序的影响: 我们知道在段直接短转移指令所对应的机器码中, 并不包含转移的目的地址, 而包含的是
27、转移的位移量(如对此概念还不太熟悉,请查看书中第 167 页的容)。也就是说,在源程序的编译过程中, 编译器遇到段直接短转移形如:jmp short 标号时就会自动算出其要跳转的位移量,以 便程序在执行段直接短转移的指令时就根 据位移量进行(向前或向后)跳转。通过调试中 的U命令我们可以看到指令 s2:jmp shorts1所对应的机器码是 EBF6, F6h(-10d的补码)就是跳转的位移量此位移量也可由指令 s2:jmp short s1 处的偏移地址 18h减去指令s2:jmp short s1 后一个字节的偏移地址22h得出。这时我们就知道了其实复制到标 号s处的指令所对应的机器码就是
28、 EBF6(刚好取代两个nop所对应的机器码),它的作用就 是将当前IP向前移动10个字节。当程序执行 标号s0处的指令后,程序便跳到标号 s处接着执行标号s处的指令。s处的指令的作用是 向前跳10字节,于是便跳到了代码中的第一 条指令,继续执行后便实现了程序的正常返 回。注意:此程序不会也不可能执行标号 s1处后的指令。assume cs:code,ds:data,ss:stackdata segmentdb welcome to masm!; 定义要显示的字符串(共16字节)db 02h,24h,71h ; 定义三种颜色属性data endsstack segmentdw 8 dup(0)sta
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1