1、汇编语言王爽第三版课后答案汇编语言王爽第三版课后答案【篇一:汇编语言王爽第二版课后答案】lass=txt (1)13(2)1024,0,1023 (3) 8192,1024 2八30,2八20,2八10 (5) 64,1,16,4 (6) 1,1,2,2,4 512,256 (8) 二进制1.第4题中的符号八指求幂运算(如 : 2A30指2的30次方)第二章 寄存器 (cpu 工作原理 )检测点 2.1(第18 页) ( 1 )写出每条汇编指令执行后相关寄存器中的值。 第一空: f4a3h 第二空: 31a3h 第三空: 3123h 第四空: 6246h 第五空: 826ch 第六 空:624
2、6h第七空:826ch 第八空:04d8h 第九空:0482h第十空:6c82h 第十一空: d882h 第十二空: d888h 第十三空: d810h 第十 四空: 6246h(2) 只能使用目前学过的汇编指令,最多使用 4 条指令,编程计算 2 的 4 次方。 解答如下: mov ax,2 add ax,ax add ax,ax add ax,ax 检测点 2.2(第23 页) (1)00010h,1000fh (2)1001h,2000h第 2 题说明:因为段的起始地址要为 16 的倍数。所以当段地址小于 1001h 或大 于 2000h 时 cpu 都无法寻到。检测点 2.3(第33
3、页) 答: cpu 修改了 4 次 ip 的值。 情况如下:第 1 次:执行完 mov ax,bx 后 第 2 次:执行完 sub ax,ax 后 第 3 次:读入 jmp ax 后 第 4 次:执行完 jmp ax 后 最后 ip 的值为 0 实验 1 查看 cpu 和内存,用机器指令和汇编指令编程 (第 33 页)1 .预备知识: debug 的使用 此部分略2. 实验任务 (第 43 页 ) (1)此部分略 (2)此部分略(3)通过 debug 中的 d 命令查看到主板的生产日期 以月、日、年,分 隔符为 / 的格式 存储在内存 ffff:0005ffff:000c( 共 8 个字节单元
4、中 )处。 此生产日期不能被改变,因为其具有 只读属性。 (4) 通过向内存中的显存写入数据,使计算机根据写入的数据进行 ascii 转换,并将转换后且可打印的字符输出到屏幕上。注:关于显存的 详细讨论不在此题范围第三章 寄存器 (内存访问 ) 检测点 3.1(第 52 页) (1)(题目:略 ) 第一空: 2662h 第二空: e626h 第三空: e626h 第四 空: 2662h 第五空: d6e6h 第六空: fd48h 第七空: 2c14h 第八空: 0000h 第九空: 00e6h 第十空: 0000h 第十一空: 0026h 第十二空: 000ch提示:此题可在 debug 中利
5、用 e 命令在本机上按照题目中所给出的 内存单元及其数据进行相应地修改,然后再用 a 命令进行写入 (题目 中所给出的 )相应的汇编指令,最后再进行 t 命令进行逐步执行,以 查看相应结果。1ax=5bea ax=5cca bx=30f0 bx=6029sp=fe 220fe 5cca sp=fc 220fc 6029 sp=fe 6029 sp=100h 5ccasp=fe 220fe 30f0 sp=fc 220fc 2e39 说明:此题可能因机子软、硬件环境不同而导致答案不一致!(2) 仔细观察图 3.19 的实验过程,然后分析:为什么2000:02000:f 中的内容会发生改变?答:因
6、为用 t 指令进行调试时,会产生中断。而为了保护现场, cpu 则先将标志寄存器进栈、再把当前 cs 的值进栈,最后将 ip 的值进 栈。关于中断的详细内容的讨论不在此题范围第五章 bx 和 loop 指令实验 4 bx 和 loop 的使用 (第 113 页 ) (1) 编程,向内存 0:2000:23f 依次传送数据 063(3fh) 。 程序如下: assume cs:codesg codesg segmentmov ax,0020h mov ds,ax mov bx,0 mov dl,0mov cx,40hinc dl inc bx loop smov ax,4c00h2int 21h
7、mov bx,0mov cx,18h;18h 为所填写的数据codesg ends end(2) 编程,向内存 0:2000:23f 依次传送数据 063(3fh) ,程序中只 能使用 9 条指令, 9 条指令中 s:mov al,bx mov es:bx,al 包括 “mov ax,4c00h ”和“ int 21h 。”程序如下: assume cs:codesg codesg segment mov ax,0020h mov ds,ax mov bl,0 mov cx,40h s: mov bx,bl inc bl loop s mov ax,4c00hint 21hcodesg end
8、s end(3) 下面的程序的功能是将 “mov ax,4c00h ”之前的指令复制到内存 0:200 处,补全程序。上机调试,跟踪运行结果。 assume cs:code code segment mov ax,code ;code 为所填写的数据 mov ds,ax mov ax,0020h mov es,axinc bx loop s mov ax,4c00hint 21hcode ends end提示:1. 因为题目的要求是把代码段内的指令当作数据,复制到目的地址。 所以,源数据段 ds 和代码段 cs 相同,通过 mov ax,code/mov ds,ax (/ 符号是指两条指令的分
9、隔 )来设置源数据段。2.可以先假设要复制8位1hOffh数据(因为我们肉眼就可以看出此 程序的长度不可能大于 0ffh 个字节 )的字节数 (如: 1 0h) ,把程序补 全,以便通过编译。这时我们以准确的第一空所填内容 code 与假想 的第二空内容 10h 将程序补充完整并将其编译、连接、运行,接着 进行 debug ,在 debug 时我们可用 r 命令查看 cx 的值,这时我们 可以看到ex的值为1d,由此我们可以算出该程序的长度 1dh-5h=18h ,之所以减 5 是为了满足题目的要求 (因为 mov ax,4e00h/int 21h 这两条指令的长度等于 5)第六章 包含多个段
10、的程序检测点 6.1(第 119 页) (1 )assume es:eodesg eodesg segment dw0123h,0456h,0789h,0abeh,0defh,0fedh,0ebah,0987hstart: mov ax,0mov ds,ax mov bx,0mov cx,8 s: mov ax,bxmov cs:bx,ax ; 此条指令为所填指令 add bx,2 loop s mov ax,4c00h int 21h codesg ends end start (2) assume cs:codesg codesg segment dw 0123h,0456h,0789h,
11、0abch,0defh,0fedh,0cbah,0987hdw 0,0,0,0,0start: mov ax,cs ;cs 为所填第一空 mov ss,axmov sp,1ah ; 此条指令为所填第二空 mov ax,0 mov ds,ax movbx,0mov cx,8s:push bxpop cs:bx ; 此条指令为所填第三空add bx,2 loop s mov ax,4c00hint 21hcodesg ends end start实验 5 编写、调试具有多个段的程序 (第 123 页) (1) 1. 保持不变 2.考虑不同机子环境不同,答案无法统一 3.x-2 , x-1 (2)
12、1. 保持不变2.考虑不同机子环境不同,答案无法统一 3.x-2 ,x-14.(n/16+1)*16 说明: n/16 只取整数部分 (3) 1. 保持不变 2. 考虑不同机子环境不同,答案无法统一 3.x+3 ,x+44(4)答:第 3个仍然可以正确执行。因为如果把 end 指令后的标号 start 去掉后,编译器便会顺序执行程序。换句话说:当未给编译器 预先的通知,要求其从哪开始执行程序时,编译器就自动以至上向 下的顺序进行编译执行源 loop s1mov ax,bmov es,axmov ds,ax 程序。(5) 完整程序如下:assume cs:code a segment db 1,
13、2,3,4,5,6,7,8 a ends b segment db 1,2,3,4,5,6,7,8 b ends c segment db 0,0,0,0,0,0,0,0 c ends code segment start:mov ax,a mov es,ax mov ax,c mov ds,ax mov bx,0 mov cx,8 s1:mov ax,es:bx add bx,ax add bx,2 mov bx,0mov cx,8 s2:mov ax,es:bx add bx,ax add bx,2 loop s2 mov ax,4c00h int 21h code ends end st
14、art (6)完整程序如下: assume cs:code a segment dw 1,2,3,4,5,6,7,8 a ends b segment dw 0,0,0,0,0,0,0,0 b ends code segment start: mov ax,b mov ss,ax 5篇二:汇编语言课后习题答案 王爽主编】一个值为 0 的字节,找到后,将它的偏移地址存储在 dx 中。 assume cs:code code segment start: mov ax,2000h mov ds,axmov bx,0s: mov ch,0 mov cl,bx jcxz ok; 当 cx=0 时, c
15、s:ip 指向 okinc bx jmp short s ok: mov dx,bx mov ax ,4c00h int 21h code ends end start 检测点 9.3补全编程,利用 loop 指令,实现在内存 2000h 段中查找第一个值 为 0 的字节,找到后,将它的偏移地址存储在 dx 中。assume cs:code code segment start: mov ax,2000h mov ds,ax mov bx,0 s:mov cl,bx mov ch,0 inc cx inc bx loop s ok:dec bx mov dx,bx mov ax,4c00h i
16、nt 21h code ends end start 书 p101 ,执行 loop s 时,首先要将 (cx) 减 1 。 “loop 标号”相当于 dec cxif(cx) 丰 0) jmp short标号检测点 10.1 补全程序,实现从内存 1000 : 0000 处开始执行指令。assume cs:code stack segment db 16 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ax, 1000h mov ax,0 push ax retf code ends en
17、d start 执行 reft 指令时,相当于进行: pop ip pop cs 根据栈先进后出原则,应先将段地址 cs 入栈,再将偏移地址 ip 入 栈。检测点 10.3 下面的程序执行后, ax 中的数值为多少? 内存地址机器码 汇编指令执行后情况 1000:0 b8 00 00 mov ax,0 ax=0,ip 指向 1000:3 1000:3 9a 09 00 00 10 call far ptr s pop cs,pop ip,ip 指向 1000:91000:8 40 inc ax1000:9 58 s:pop ax ax=8h add ax,ax ax=10h pop bx bx
18、=1000h add ax,bx ax=1010h 用 debug 进行跟踪确认, “ call far ptr s 是先”将该指令后的第一个 字节段地址 cs=1000h 入栈,再将偏移地址 ip=8h 入栈,最后转到 标号处执行指令。出栈时,根据栈先进后出的原则,先出的为 ip = 8h,后出的为cs =1000h检测点 10.4下面的程序执行后, ax 中的数值为多少? 内存地址机器码 汇编指令 执行后情况1000:0 b8 06 00mov ax,6 ax=6,ip 指向 1000:31000:3 ff d0call ax pop ip,ip 指向 1000:61000:5 40inc
19、 ax1000:6 58mov bp,spbp=sp=fffehadd ax,bp ax=6+ds:(fffeh)=6+5=0bh用 debug 进行跟踪确认, “ call ax(16 位 reg) ”是先将该指令后的第 一个字节偏移地址 ip 入栈,再转到偏移地址为 ax(16 位 reg) 处执行 指令。检测点 10.5 (1)下面的程序执行后, assume cs:code stack segment dw 8 dup (0) stack ends code segment start: mov ax,stack mov ss,ax mov sp,16 mov ds,ax mov ax
20、,0 call word ptr ds:0eh inc ax inc ax mov ax,4c00h int 21h code ends end start 推算: 执行 call word ptr ds:0eh 最后 ip 转移到 (ds:0eh) ax=3ax 中的数值为多少?指令时,先 cs 入栈,再 ip=11 入栈, (ds:0eh)=11h ,执行 inc ax? 最终题中特别关照别用 debug 不住去试试,看是什么结果。 根据单步跟踪发现,执行 call word ptr ds:0eh 指令时,显示跟踪,跟踪结果不一定正确,但还是忍ds:0eh = 065d。ds:0000ds
21、:0010 不是已设置成 stack 数据段了嘛,不是应该全都 是 0 的嘛。于是进行了更详细的单步跟踪,发现初始数据段中数据确实为 0,但执行完 mov ss,ax ; mov sp,16 这两条指令后,数据段中数据发 生改变。这是为什么呢?中断呗 检测点 10.5( 2)下面的程序执行后, ax 和 bx 中的数值为多少? assume cs:codesgstack segment dw 8 dup(0) stack ends codesg segment start: mov ax,stack mov ss,ax mov sp,10h mov word ptr ss:0,offset s
22、 ;(ss:0)=1ah mov ss:2,cs ;(ss:2)=cscall dword ptr ss:0 ;cs 入栈 ,ip=19h 入栈 , 转到 cs:1ah 处执行指 令;(ss:4)=cs,(ss:6)=ip nops: mov ax,offset s ;ax=1ah sub ax,ss:0ch ;ax=1ah-(ss:0ch)=1ah-19h=1mov bx,cs ;bx=cs = 0c5bhsub bx,ss:0eh ;bx=cs-cs=0 mov ax,4c00hint 21h codesg ends end start c:docume1admini1debug jc10
23、-5.exe -u0c5b:0000 b85a0c mov ax,0c5a0c5b:0003 8ed0 mov ss,ax0c5b:0005 bc1000 mov sp,00100c5b:0008 36ss:0c5b:0009 c70600001a00 mov word ptr 0000,001a0c5b:000f 36ss:0c5b:0010 8c0e0200mov 0002,cs0c5b:0014 36ss:0c5b:0015 ff1e0000call far 00000c5b:0019 90nop0c5b:001a b81a00 mov ax,001a0c5b:001d 36ss:0c5
24、b:001e 2b060c00sub ax,000c -u0c5b:0022 8ccb mov bx,cs0c5b:0024 36ss:0c5b:0025 2b1e0e00sub bx,000e 0c5b:0029 b8004c mov ax,4c00 课程设计一将实验 7 中的 power idea 公司的数据按照图所示的格式在屏幕上 显示现来 table segmentdb 1975,1976,1977,1978,1979,1980,1981,1982,1983 db 1984,1985,1986,1987,1988,1989,1990,1991,1992 db 1993,1994,199
25、5 dd 16,22,382,1356,2390,8000,16000,24486,50065,97479,140417,197 514 dd 345980,590827,803530,1183000,1843000,2795000,3753000,4649 000,5937000 dw 3,7,9,13,28,38,130,220,476,778,1001,1442,2258,2793,4037,5635,8 226 dw 11542,14430,15257,17800 dw 5,3,42,104,85,210,123,111,105,125,140,136,153,211,199,209,
26、224, 239 dw 260,304,333 table ends data segment db 32 dup (0) data ends code segment start: mov ax,data mov ds,ax mov ax,table mov es,ax mov bx,0 mov si,0 mov di,0 mov cx,21mov dh,2 mov dl,30 g: push cx push dx mov ax,es:bx mov si,ax mov ax,es:bx.2 mov si.2,ax ; 年份入 ds:si add si,6 mov ax,es:bx.84 mo
27、v dx,es:bx.86 call dtoc2 ; 收入转成十进制字符入 ds:si add si,10 mov ax,es:di.168 mov dx,0 call dtoc2 ; 人员数转成十进制字符入 ds:si add si,6 mov ax,es:di.210 mov dx,0 call dtoc2 ; 人均收入转成十进制字符入 ds:si mov si,0 ; 设置 ds:si 指向需显示字符首地址 b: mov cx,29 c: push cx mov cl,si jcxz f ;(ds:si)=0 转到 f 执行 d: inc si pop cx loop c inc si
28、mov al,0mov si,al ; 设置结尾符 0mov si,0 ; 设置 ds:si 指向需显示字符首地址 pop dx mov cl,2 call show_stradd bx,4 ;dword 数据指向下一数据单元 add di,2 ;word 数据指向下一数据单元 add dh,1 ; 指向显存下一行 pop cxloop gmov ax,4c00hint 21h f: mov al,20h mov si,al ;(ds:si)=0 的数据改成空格 jmp d; 名称: dtoc2; 功能:将 dword 型数据转变为表示十进制的字符串,字符串以 0 为结尾符。 ; 参数: (a
29、x)=dword 型数据的低 16 位; ;(dx)=dword 型数据的高 16 位;;ds:si 指向字符串首地址。; 返回:无。dtoc2:push axpush bxpush cxpush dx push si push di mov di,0 d20: mov cx,10 ; 除数为 10 call divdwadd cx,30h ; 余数 +30h ,转为字符push cx ; 字符入栈inc di ; 记录字符个数 mov cx,axjcxz d21 ; 低位商 =0 时,转到 d21 检测高位商jmp d20d21: mov cx,dxjcxz d22 ; 高低位商全 =0 时
30、,转到 d22 执行jmp d20d22: mov cx,did23: pop ax ; 字符出栈 mov si,al inc si ;ds:si 指向下一单元 loop d23mov al,0mov si,al ; 设置结尾符 0pop dipop sipop dxpop cxpop bxpop axret【篇三:汇编语言 (王爽 )_第二版 _课后题全 _答案 23 】terminated normally-q实验 4 bx 和 loop 的使用 (3)下面的程序功能是将 “mov ax,4c00h 之前的指令复制到内存 0:200 处,补全程序。上机调试,跟踪运行结果。assume cs
31、:codecode segment 或 mov ds,axmov ax,0020hmov es,axmov bx,0 或或 sub cx,5s: mov al,bxmov es:bx,alinc bx loop s mov ax,4c00h int 21h code ends end 此题有多个答案,因为 mov 用在寄存器之间传送数据的指令是 2 个字节,用在寄存器和立即数之间是 3 个字节答案 1:mov ax,cs ( 占 2 个字节 )mov cx,17答案 2:mov ax,code ( 占 3 个字节 )mov cx,18答案 3:mov ax,cs 或 mov ax,code把改成 sub cx,5( 因为在载入程序时 ,cx 保存程序的长度 ,减去 5 是为减去 mov ax,4c00h 和 int 21h 的长度 )此题的目的是 :