汇编语言(王爽)课后习题答案

欢迎来我的 Web3 Blog 上浏览汇编语言(汇编语言 课后习题答案集)
Web3 Blog 【汇编语言课后习题答案及详解】
习题答案:仅供参考

课后题答案+解析:


检测点1.1

1:13                                                                                                                                   

2:1024 0 1023                                                                                                                          

3:2^13 2^10                                                                                                                            

4:2^30 2^20 2^10                                                                                                                       

5:64 1 16 4                                                                                                                            

6:1 1 2 2 4                                                                                                                            

7:512 256                                                                                                                             

8:二进制                                                                                                                               

题解:                                                                                                                                  

1:cpu的寻址能力是8KB,地址总线宽度为10根的寻址能力是1KB=1024b=2^10,所以2^x=8KB=8*1024=2^13                                             

所以x=13。                                                                                                                             

2:1B是一个存储单元,1KB=1024B,等于1024个存储单元,由于存储单元的范围是从(00000 00000 ~ 11111 11111)转化成十进制就是0~1023,所以存储单元

的编号是0到1023。                                                                                                                      

3:1B=8bit,1KB=2^10B=8*1024bit=2^13。                                                                                                   

4:1GB=1024*1KB=10241MB=1024*1024*1KB=1024*1024*1024*1B                                                                                

1GB=2^30B,1MB=2^20B,1KB=2^10B。                                                                                                        

5:10根地址总线的寻找能力是1KB,那么16是2^6KB,20是1024KB=1MB,24是2^4*1MB=16MB,32是1024*4*1MB=4GB。                                     

6:一根数据线,传输1bit,八根传输8bit,8bit=1B,那么答案分别是1,1,2,2,4。                                                            

7:8086每次读取2B(字节),1024B/2B=512次,80386每次读取4字节,那么答案:1024B/4B=256次。

检测点2.1

(1)写出每条汇编i指令执行后相关寄存器的中的值
mov ax,62627 AX=F4A3H
mov ah,31H AX=31A3H
mov al,23H AX=3123H
add ax,ax  AX=6246H
mov bx,826CH BX=826CH
mov cx,ax CX=6246H
mov ax,bx AX=826CH
add ax,bx AX=04D8H
mov al,bh AX=0482H
mov ah,bl AX=6C82H
add ah,ah AX=D882H
add al,6  AX=D888H
add al,al AX=D810H
mov ax,cx AX=6246H
(2)利用已写学习的汇编指令编写出2^4
mov ax,2  AX=2
add ax,ax AX=4
add ax,ax AX=8
add ax,ax AX=16 

检测点2.2

(1) 00010H,1000FH

(2) 1001H,2000H
 
 题解:
 (1)物理地址=给定段地址*16+(0~FFFF)
 所以范围:00010H+0H~00010H+FFFFH=(00010H~1000FH)
 (2)设给定段地址为XH:
 最大段地址:X*16=20000H
 X=2000H
 最小段地址:X*16+FFFF=20000H
 X*16=10001H
 但是X右移一位为1000H<1000.1H
 所以X=1001H
 
 思考
 所以当X<1001H或者X>2000H时,cpu无论怎么变化偏移地址都无法寻到20000H单元 

检测点2.3

下面的三条指令执行后,cpu几次修改IP?都是在什么时候,最后IP的值是多少?
mov ax,bx
sub ax,ax
jmp ax
答案:(1)4次
(2)
第一次读取mov ax,bx
第二次读取sub ax,ax
第三次读取jmp ax
第四次执行jmp ax
(3)
最后 IP的值是0,
假设CS=a,IP=b
那么执行完第一条指令后
CS=a,IP=b+2
ax=bx
执行完第二条指令
CS=a,IP=b+4
ax=0
执行完第三条指令
首先CS=a,IP=b+4
此时第三条指令读取完毕
然后执行第三条指令
IP=ax=0
CS=a,IP=0 
最后IP是0
 

检测点3.1

(1)
AX=2662H
BX=E626H
AX=E626H
AX=2662H
BX=D6E6H
AX=FD48H
AX=2C14H
AX=0000H
AX=00E6H
BX=0000H
BX=0026H
AX=000CH
(2)
CS=2000H,IP=0,DS=1000H
AX=0,BX=0

mov ax,6622H 
CS=2000H IP=3 DS=1000H AX=6622H BX=0000H
jmp 0ff0:0100 
CS=0ff0H IP=0100 DS=1000H AX=6622H BX=0000H 
mov ax,2000H 
CS=0ff0H IP=0103 DS=1000H AX=2000H BX=0000H
mov ds,ax 
CS=0ff0H IP=0105 DS=2000H AX=2000H BX=0000H
mov ax,[0008] 
CS=0ff0H IP=0108 DS=2000H AX=C389H BX=0000H
mov ax,[0002] 
CS=0ff0H IP=010B DS=2000H AX=EA66H BX=0000H
(3)
数据和程序在计算机中都是以二进制的形式存放的,
在区别程序和数据时,关键是看段地址,如果段地址是ds
段,说明该内存存放的是数据,如果段地址是cs段,说明该内存
存放的是指令。


检测点3.2

(1)
mov ax,2000
mov ss,ax
mov sp,0010 
(2)
mov ax,1000
mov ss,ax
mov sp,0000 
 

检测点 6.1

(1)
mov cs:[bx],ax
(2) 
cs
24h或36
pop cs:[bx]

检测点 9.1

(1)
1:db 0,0,0,0
2: dw 2 dup(0)
(2)
bx
cs
(3)
0006H
00BEH

注意:理解 word ptr 和 dword ptr的概念 

检测点 9.2

(1)
mov ch,0
mov cl,[bx]
jcxz ok
inc bx 

解释:我们要确保cx的高位为0
mov ch,0
mov cl,[bx]
如果当前的cx==0,那么执行jcxz jmp short ok 

检测点 9.3

(1)
inc cx

解释:不能让cx=0,不然在loop指令下无法退出,如果cx=0,我们让cx+1,
此时就可以退出了 

检测点 10.1

(1)
1000h,0
先把1000推入栈,在把0
retf 执行后,cs=1000,ip=0


检测点 10.2

(1)6
解释,
执行完call s 指令被读取完后,ip->6,然后执行call s指令,将 当前ip的值
压入栈,转跳到标号 s ,执行pop ax,此时ax=6


检测点 10.3

1000:0        mov ax,0
1000:3        call far ptr s 
1000:8        inc ax
1000:9        s:pop ax    
              add ax,ax    
              pop bx    
              add ax,bx    
(1)1010
ax=0
push 1000
push 0008
jmp 1000:9
pop ax,8  ax=0008
add ax,ax ax=0010
pop bx    bx=1000
add ax,bx ax=1010
(1) 3

assume cs:code

stack segment

dw 8 dup(0)

stack ends

code segment

start:

  mov ax,stack  ;ax=栈段地址

  mov ss,ax  ;  ss栈段地址=ax 

  mov sp,16  ; 栈顶偏移地址sp=16=10H

  mov ds,ax   ;段地址 ds=ax 和栈段一致

  mov ax,0

  call word ptr ds:[0Eh]  ; push ip ,ip= inc ax处的ip

    ; 此时 ss:0eh: inc ax处的ip

    ; ds=ss:[0]=ss:0eh

  inc ax        ;执行下面语句 

  inc ax

  inc ax         ax=3

  mov ax,4c00H  

  int 21H

code ends

end start
(2)
assume cs:code
data segment
    dw 8 dup (0)
data ends

code segment

start:  mov ax,data
        mov ss,ax
        mov sp,16
        mov word ptr ss:[0],offset s   
        mov ss:[2],cs                 
        call dword ptr ss:[0]         
        nop
s:      mov ax,offset s                
        sub ax,ss:[0cH]                
        mov bx,cs
        sub bx,ss:[0eH]               
        mov ax,4c00H
        int 21H

code ends

end start 
解释:
首先 我们让栈地址[0],[2]存放cs,和s标号处的ip,然后执行call dword ptr
ss:[0],此时 push nop 处的cs和ip,sub ax,ss:[0H],因为栈里存的是一条空语句地址。
所以ax=1,因为cs相同所以 bx=0 

检测点 11.1

(1)
          ZF  PF  SF
sub al,al 1   1   0 结果0b 1 1 0 为0 0个1 非负
mov al,1  1   1   0 传送指令不影响标志寄存器的状态
push ax   1   1   0 传送指令不影响标志寄存器的状态
pop bx    1   1   0 传送指令不影响标志寄存器的状态
add al,bl 0   0   0 结果10b 不为0 1个1 非负
add al,10 0   1   0 结果1100b 2个1 非负
mul al    0   1   0 结果10010000b 2个1 非负
(2)
            CF    OF     ZF    PF   SF
sub al,al   0     0      1     1     0             
mov al,10h  0     0      1     1     0
add al,90h  0     0      0     1     1
mov al,80h  0     0      0     1     1
add al,80h  1     1      1     1     0
mov al,0fch 1     1      1     1     0
add al,05h  1     0      0     0     0
mov al,7dh  1     0      0     0     0
add al,0bh  0     1      0     1     1 

检测点 11.3

(1)
jb s0
ja s0
(2)
jna s0
jnb s0

检测点11.4

(1)
45h
解释:通过操作标志寄存器的值为000000001000101b
最后ax的值是45H 

检测点 12.1

(1)0070:018BH
(2)4N,4N+2
解释:
可以查看段地址 0070=3*4+2位置
偏移地址:018B=3*4位置
 
第1章 基础知识 1.1 机器语言 1.2 汇编语言的产生 1.3 汇编语言的组成 1.4 存储器 1.5 指令和数据 1.6 存储单元 1.7 CPU对存储器的读写 1.8 地址总线 1.9 数据总线 1.10 控制总线 1.11 内存地址空间(概述) 1.12 主板 1.13 接口卡 1.14 各类存储器芯片 1.15 内存地址空间 第2章 寄存器 2.1通用寄存器 2.2字在寄存器中的存储 2.3几条汇编指令 2.4物理地址 2.516位结构的CPU 2.68086CPU给出物理地址的方法 2.7“段地址×16+偏移地址=物理地址” 的本质含义 2.8段的概念 2.9段寄存器 2.10CS和IP 2.11修改CS、IP的指令 2.12代码段 实验1查看CPU和内存,用机器指令 和汇编指令编程 第3章寄存器(内存访问) 3.1内存中字的存储 3.2DS和(address) 3.3字的传送 3.4mov、add、sub指令 3.5数据段 3.6栈 3.7CPU提供的栈机制 3.8栈顶超界的问题 3.9push、pop指令 3.10栈段 实验2用机器指令和汇编指令编程 第4章第一个程序 4.1一个源程序从写出到执行的过程 4.2源程序 4.3编辑源程序 4.4编译 4.5连接 4.6以简化的方式进行编译和连接 4.71.exe的执行 4.8谁将可执行文件中的程序装载进入 内存并使它运行? 4.9程序执行过程的跟踪 实验3编程、编译、连接、跟踪 第5章(BX)和loop指令 5.1(BX) 5.2Loop指令 5.3在Debug中跟踪用loop指令实现的 循环程序 5.4Debug和汇编编译器masm对指令的 不同处理 5.5loop和(bx)的联合应用 5.6段前缀 5.7一段安全的空间 5.8段前缀的使用 实验4(bx)和loop的使用 第6章 包含多个段的程序 6.1在代码段中使用数据 6.2在代码段中使用栈 6.3将数据、代码、栈放入不同的段 实验5编写、调试具有多个段的程序 第7章更灵活的定位内存地址的 方法 7.1anol和or指令 7.2关于ASCII码 7.3以字符形式给出的数据 7.4大小写转换的问题 7.5(bx+idata) 7.6用(bx+idata)的方式进行数组的 处理 7.7SI和DI 7.8(bx+si)和(bx+di) 7.9(bx+si+idata)和(bx+di+idata) 7.10不同的寻址方式的灵活应用 实验6实践课程中的程序 第8章数据处理的两个基本问题 8.1bx、si、di和bp 8.2机器指令处理的数据在什么地方 8.3汇编语言中数据位置的表达 8.4寻址方式 8.5指令要处理的数据有多长 8.6寻址方式的综合应用 8.7div指令 8.8伪指令dd 8.9dup 实验7寻址方式在结构化数据访问中的 应用 第9章转移指令的原理 9.1操作符offset 9.2jmp指令 9.3依据位移进行转移的jmp指令 9.4转移的目的地址在指令中的jmp 指令 9.5转移地址在寄存器中的jmp指令 9.6转移地址在内存中的jmp指令 9.7jcxz指令 9.8loop指令 9.9根据位移进行转移的意义 9.10编译器对转移位移超界的检测 实验8分析一个奇怪的程序 实验9根据材料编程 第10章CALL和RET指令 10.1ret和retf 10.2call指令 10.3依据位移进行转移的call指令 10.4转移的目的地址在指令中的call 指令 10.5转移地址在寄存器中的call指令 10.6转移地址在内存中的call指令 10.7call和ret的配合使用 10.8mul指令 10.9模块化程序设计 10.10参数和结果传递的问题 10.11批量数据的传递 10.12寄存器冲突的问题 实验10编写子程序 课程设计1 第11章标志寄存器 11.1ZF标志 11.2PF标志 11.3SF标志 11.4CF标志 11.5OF标志 11.6adc指令 11.7sbb指令 11.8cmp指令 11.9检测比较结果的条件转移指令 11.10DF标志和串传送指令 11.11pushf和popf 11.12标志寄存器在Debug中的表示 实验11编写子程序 第12章内中断 12.1内中断的产生 12.2中断处理程序 12.3中断向量表 12.4中断过程 12.5中断处理程序和iret指令 12.6除法错误中断的处理 12.7编程处理0号中断 12.8安装 12.9do0 12.10设置中断向量 12.11单步中断 12.12响应中断的特殊情况 实验12编写0号中断的处理程序 第13章int指令 13.1int指令 13.2编写供应用程序调用的 中断例程 13.3对int、iret和栈的深入理解 13.4BIOS和DOS所提供的 中断例程 13.5BIOS和DOS中断例程的 安装过程 13.6BIOS中断例程应用 13.7DOS中断例程应用 实验13编写、应用中断例程 第14章端口 14.1端口的读写 14.2CMOS RAM芯片 14.3shl和shr指令 14.4CMOS RAM中存储的时间信息 实验14访问CMOS RAM 第15章外中断 15.1接口芯片和端口 15.2外中断信息 15.3PC机键盘的处理过程 15.4编写int 9中断例程 15.5安装新的int 9中断例程 实验15安装新的int 9中断例程 第16章直接定址表 16.1描述了单元长度的标号 16.2在其他段中使用数据标号 16_3直接定址表 16.4程序入口地址的直接定址表 实验16编写包含多个功能子程序的 中断例程 第17章使用BIOS进行键盘输入 和磁盘读写 17.1int 9中断例程对键盘输入的处理 17.2使用int 16h中断例程读取 键盘缓冲区 17.3字符串的输入 17.4应用int 13h中断例程对磁盘 进行读写 实验17编写包含多个功能子程序的 中断例程 课程设计2 综合研究 研究试验1搭建一个精简的C语言 开发环境 研究试验2使用寄存器 研究试验3使用内存空间 研究试验4不用main函数编程 研究试验5函数如何接收不定数量的 参数 附注 附注1Intel系列微处理器的3种工作 模式 附注2补码 附注3汇编编译器(masm.exe)对jmp的 相关处理 附注4用栈传递参数 附注5公式证明
检测点1.1 (1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13位。 (2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 。 (3)1KB的存储器可以存储 8192(2^13) 个bit, 1024个Byte。 (4)1GB是 1073741824 (2^30) 个Byte、1MB是 1048576(2^20) 个Byte、1KB是 1024(2^10)个Byte。 (5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为: 64 (KB)、 1 (MB)、 16 (MB)、 4 (GB)。 (6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为: 1 (B)、 1 (B)、 2 (B)、 2 (B)、 4 (B)。 (7)从内存中读取1024字节的数据,8086至少要读 512 次,80386至少要读 256 次。 (8)在存储器中,数据和程序以 二进制 形式存放。 解题过程: (1)1KB=1024B,8KB=1024B*8=2^N,N=13。 (2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。 (3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。 (4)1GB=1073741824B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。 (5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。(一个内存单元=1Byte)。 (6)8根数据总线一次可以传送8位二进制数据(即一个字节)。 (7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。 (8)在存储器中指令和数据没有任何区别,都是二进制信息。
### 回答1: 《汇编语言 第4版 王爽 pdf》是一本经典的计算机教材,主要介绍了汇编语言的基本原理和编程方法。本书内容详实全面,对于学习汇编语言具有很强的实用性和指导性。 首先,本书通过介绍计算机组成原理、指令系统和寻址方式等基础知识,帮助读者全面理解计算机的工作原理。通过此部分的学习,读者可以对计算机的各个组成部分进行了解,为后续的汇编语言编程打下良好基础。 其次,本书详细讲解了汇编语言的基本语法和指令集。通过具体的代码示例和相关练习,读者可以逐步掌握如何进行数据的存储和运算,以及如何使用寻址方式进行数据传递和控制程序流程。同时,本书还介绍了常用的汇编指令和编程技巧,如循环、条件判断、数组和函数等,帮助读者解决实际问题。 此外,本书还特别关注了汇编语言与C语言的关系和应用。通过对比分析,读者可以更好地理解两种语言之间的联系和差异,充分利用汇编语言的优势来进行性能优化和系统开发。 总结来说,《汇编语言 第4版 王爽 pdf》是一本经典而实用的教材,对于理解计算机底层原理、提高程序编写能力和进行系统开发都具有重要的意义。无论是计算机科学专业的学生,还是从事相关工作的从业者,都可以通过学习本书来提升自己的技术水平。 ### 回答2: 《汇编语言 第4版》是王爽编写的一本经典的汇编语言教材。该教材以通俗易懂的方式,介绍了汇编语言的基本原理和应用技巧。 在这本书中,王爽首先系统地介绍了计算机的基本知识,包括计算机的组成结构、运算器、控制器等。然后,他详细讲解了汇编语言的基本知识,包括汇编语言的特点、汇编指令的格式、汇编程序的编写等。 接着,王爽介绍了汇编语言的程序设计方法和技巧。他通过丰富的例子和详细的讲解,教授了如何使用汇编语言编写各种程序,如输入输出程序、字符串处理程序、数组操作程序等。通过学习这些例子,读者可以逐步掌握汇编语言的应用。 此外,王爽还介绍了8086指令系统和保护模式的编程,并讲解了汇编程序的调试和优化技巧。他通过大量的实例和实践指导,帮助读者深入理解和掌握汇编语言的高级知识和技术。 《汇编语言 第4版》的特点是内容全面、深入浅出,适合初学者和有一定汇编语言基础的读者阅读。这本书的另一个优点是配有大量的习题和实践项目,读者可以通过完成这些习题和项目,进一步加深对汇编语言的理解和应用能力。 综上所述,《汇编语言 第4版》是一本权威、经典且实用的汇编语言教材,可以帮助读者全面理解汇编语言的原理和应用,并掌握汇编语言的编程技巧和调试优化技巧。对于想要深入了解计算机底层原理和编程的读者来说,阅读这本书是一个很好的选择。 ### 回答3: 《汇编语言 第4版》是由王爽撰写的经典教材,该书以汇编语言为主题,全面系统地介绍了汇编语言的基本概念、基本指令和编程技巧。 这本教材共分为13章,内容包括了汇编语言的发展历程、基本概念和原理、汇编语言的基本组成和格式。同时,还介绍了常用的寻址方式和常见的指令集,如8086指令集和80386指令集等。此外,书中还详细说明了汇编语言程序的编写和调试方法,并给出了大量的实例和练习题,以帮助学习者掌握汇编语言的编程技巧。 《汇编语言 第4版》的特点是理论与实践相结合,既有理论知识的系统介绍,又有大量的实例和练习,可以帮助读者深入理解汇编语言的原理和应用。另外,该书对一些常见的编程错误和调试技巧也进行了详细讲解,有助于读者提高编程的效率和调试的准确性。 本书的优点在于,用简明的语言和通俗的讲解风格,将抽象的概念和复杂的原理以生动的方式呈现给读者,使读者能够轻松理解和掌握汇编语言的知识。同时,书中的例子和练习题也非常实用和有针对性,能够帮助读者熟练掌握汇编语言的编程技巧。 总之,《汇编语言 第4版》是一本经典的汇编语言教材,对于想要深入学习和了解汇编语言的读者来说,是一本值得推荐的书籍。无论是初学者还是有一定基础的读者,都可以通过阅读该书来提高自己的汇编语言编程能力。
评论 48
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值