第九章 转移指令的原理
- 格式:ppt
- 大小:105.50 KB
- 文档页数:30
汇编语言王爽第三版检测点答案带目录在学习汇编语言的过程中,王爽老师的《汇编语言(第三版)》无疑是一本备受推崇的经典教材。
而对于学习者来说,检测点的答案能够帮助我们更好地巩固知识,查漏补缺。
接下来,我将为大家详细呈现这本教材中各个章节检测点的答案,并附上清晰的目录,方便大家查阅和学习。
第一章基础知识检测点 11(1)1 个 CPU 的寻址能力为 8KB,那么它的地址总线的宽度为。
答案:13 位。
因为 8KB = 8×1024 = 2^13B,所以地址总线的宽度为 13 位。
检测点 12(1)8086 CPU 有根数据总线。
答案:16 根。
(2)8086 CPU 有根地址总线。
答案:20 根。
检测点 13(1)内存地址空间的大小受的位数决定。
答案:地址总线。
(2)8086 CPU 的地址总线宽度为 20 位,其可以寻址的内存空间为。
答案:1MB。
因为 2^20 = 1048576B = 1MB。
第二章寄存器检测点 21(1)写出每条汇编指令执行后相关寄存器中的值。
mov ax,62627 AX = 62627mov ah,31H AH = 31H,AX = 31627mov al,23H AL = 23H,AX = 3123H检测点 22(1)给定段地址为 0001H,仅通过变化偏移地址寻址,CPU 的寻址范围为到。
答案:00010H 到 1000FH。
(2)有一数据存放在内存 20000H 单元中,现给定段地址为 SA,若想用偏移地址寻到此单元。
则 SA 应满足的条件是:最小为,最大为。
答案:最小为 1001H,最大为 2000H。
第三章内存访问检测点 31(1)下面的程序实现依次用内存 0:0~0:15 单元中的内容改写程序中的数据。
完成程序。
assume cs:codesgcodesg segmentdw 0123H,0456H,0789H,0abcH,0defH,0fedH,0cbaH,0987Hstart: mov ax,0mov ds,axmov bx,0mov cx,8s: mov ax,bxmov bx+16,axadd bx,2loop smov ax,4c00hint 21hcodesg endsend start检测点 32(1)下面的程序将“Mov ax,4c00h ”之前的指令复制到内存 0:200 处。
第九章转移指令的原理1. 可以修改IP,或同时修改CS和IP 的指令统称转移指令。
概括地讲,转移指令就是可以控制CPU执行内存中某处代码的指令。
2.8086CPU的转移行为有以下几种:(1) 只修改IP 时,称为段内转移。
例如:jmp ax(2) 同时修改CS和IP 时,成为段间转移。
例如:jmp 1000:03. 由于转移指令对IP 值修改范围的不同,段内转移又分为:短转移和近转移。
(1) 短转移IP 的修改范围是-128~127(2) 近转移IP 的修改范围是-32768~327674.8086CPU的转移指令分为以下几类:(1) 无条件转移指令(如:jmp)(2) 条件转移指令(3) 循环指令(如:Loop)(4) 过程(5) 中断这些转移指令的前提条件可能不同,但转移的基本原理是相同的。
5. 操作符offset 是一个伪指令,它的功能是取得标号的偏移地址。
案例:将s 处的一条指令复制到s0处assume cs:codesgcodesg segments: mov ax,bx ;mov ax,bx 占两个字节mov si,offset s ; 得到标号s 所在的偏移地址赋值给simov di,offset s0 ; 得到标号s0所在的偏移地址赋值给dimov ax,cs:[si]mov cs:[di],axs0: nop ;nop 占一个字节nopcodesg endsend6.jmp 为无条件转移,可以只修改IP,也可以同时修改CS和IP 的值jmp 指令要给出两个信息:(1) 转移的目的地址。
(2) 转移的距离(段间转移,段内转移的短转移和近转移)7.jmp short 标号(转到标号处执行)这种指令实现的是段内短转移。
jmp 指令中的" 标号"是代码段中的标号,指明了指令要转移的目的地,转移指令结束,CS:IP 指向标号处的指令。
8.CPU在执行jmp 指令时并不需要指明转移的目标地址。
转移指令的原理转移指令的原理1.0 操作符offset操作我offset在汇编语⾔中是由编译器处理的符号,伪指令,它的功能是取得标号的偏移地址将start的代码复制到s0中去assume cs:codecode segmentstart: mov ax, bx ;这⾥占两个字节mov si, offset start ;将start的偏移地址送⼊si中 0000Hmov di, offset s0 ;将s0的偏移地址送⼊di中mov ax, cs:[si] ;通过物理地址将数据送⼊ax,在通过ax送到di中mov cs:[di], axs0: nop ;nop 占⼀个字节nopmov ax, 4c00Hint 21Hcode endsend start1.1 Jmp指令jmp为⽆条件跳转指令,只可以修改ipjmp指令需要给出两种信息转移的地址转移的距离(段内转移,段内短转移,段内近转移)assume cs:codecode segmentstart: mov ax, 0jmp short sadd ax, 1s: inc axmov ax, 4c00Hint 21Hcode endsend startjmp short 标号(转移到标号处执⾏命令)这种jmp格式指令实现的是段内短转移,它对ip的修改范围为-128~127,也就是说,它向前可以越过128个字节,向后的话最多可以越过127个字节assume cs:codecode segmentstart: mov ax, 0jmp short ptr sdb 256 dup(0) ;这⾥定义256个空字节 short是跳不过去的,编译不会通过,可以改成near ptr, far ptrs: inc axmov ax, 4c00Hint 21Hcode endsend start汇编与机器码的对照可以看到在汇编指令中出现的idata,不论它是⼀个数据还是偏移地址,它都会在对应的机器指令中出现,因为它是cpu执⾏的机器指令,他必须要处理的数据或地址,下图是上⾯程序对应的机器代码CPU是如何进⾏转移的尼?通过以上可以CPU 不需要⽬的地址也可以实现对地址的修改ip指向03H 将指令读取到指令缓存区,ip⾃增2变成05H,执⾏执⾏后,EB是jmp的机器码,向后在跳3个字节,ip等于08H,这个时候执⾏inc ax将ax⾃增1jmp short 标号的功能是(ip)= (ip)+8位偏移 8位位移是由程序在编译的时候算出的jmp near ptr 标号说明,段内近转移 16位位移16位位移的范围是-32768~327671.2 转移指令的⽬的地址之前的jmp,其机器码中并没有转移的⽬的地址,⽽是相对于当前ip的转移偏移jmp far ptr 标号实现的段间转移,⼜称段转移far ptr 指明了指令中标号的段地址和偏移地址改变了CS:IPassume cs:codecode segmentstart: mov ax, 0jmp far ptr sdb 256 dup(0)s: inc axmov ax, 4c00Hint 21Hcode endsend startjmp far ptr可以看出机器码是包含要跳转的地址,没有相对于当前ip的计算转移偏移1.3 jmp 寄存器相当于 jmp near ptr 标号1.4 转移地址在内存中的jmpjmp word ptr 内存单元地址功能:内存单元存储的⼀个字就是转移的⽬的地的偏移地址因为word是16位的只能完成段内转移,进⾏16位位移代码⽰例mov ax, 1234Hmov ds:[0], axjmp word ptr ds:[o] ;这⾥跳转的为CS:1234Hjmp dword ptr 内存单元地址(段间转移)功能:从内存单元地址存放2个字,⾼地址对应段地址,低地址对应偏移地址因为dword是32位的可以完成段间转移CS=内存单元地址+2IP= 内存单元地址代码⽰例mov ax, 1234Hmov ds:[0], axmov ds:[2], 0jmp word ptr ds:[0] ;这⾥跳转的为CS:IP = 0000:1234H1.5 jcxz 指令 jmp cx is zerojcxz 如果cx为0则跳转是⼀个有条件的跳转指令,所有的有条件转移指令都是短转移,对应的机器码包含转移的位移,⽽不是⽬的地址,对IP的修改都是-128~1271.6 loop指令loop为循环指令,所有循环都是短转移,对应的机器码是转移的位移,⽽不是物理地址cx为0 则向下执⾏在内存2000H段中查找第⼀个值为0的字节,找到后将偏移地址放⼊dx中assume cs:codecode segmentstart: mov ax, 2000Hmov ds, axmov bx, 0s: mov cl, [bx]mov ch, 0jcxz okinc bx ;⾃增1 去找下⼀个内存单元的数据loop sok: mov dx, bxmov ax, 4c00Hint 21Hcode endsend start1.7 根据位移进⾏转移的意义前⾯讲到:jmp short 标号jmp near ptr 标号jcxz 标号loop 标号⼏种指令,他们对ip的修改都是根据转移⽬的地址和起始地址之前的位移进⾏的,他们对应的机器码不包含转移⽬的地的地址,⽽是包含到⽬的地的位移距离这样的设计,⽅便了程序段在内存中的浮动装配如果这些指令码中是包含物理地址,则就对程序段在内存中的偏移地址有了严格的限制1.8 编程题学蒙蔽先停停。
汇编条件转移指令汇编语言是一种底层的计算机语言,它直接操作计算机硬件,因此在编写高效的程序时,掌握汇编语言是非常重要的。
条件转移指令是汇编语言中的一种重要指令,它可以根据特定的条件来改变程序的执行流程。
本文将介绍汇编条件转移指令的基本概念、语法和使用方法。
一、基本概念条件转移指令是一种根据特定条件来改变程序执行流程的指令。
在程序执行过程中,如果满足特定条件,就会跳转到指定的地址继续执行,否则就会继续执行下一条指令。
条件转移指令通常用于实现程序的分支和循环结构。
二、语法格式条件转移指令的语法格式如下:```Jcc destination```其中,Jcc表示条件转移指令的助记符,cc表示条件码,destination表示跳转的目标地址。
条件码是由前缀字母J和后缀字母S、Z、P、O、C、N等组成的,它们分别表示以下条件:- JS:符号位为1(即负数)- JZ:零标志位为1- JP:奇偶标志位为1- JO:溢出标志位为1- JC:进位标志位为1- JN:负数标志位为1三、使用方法条件转移指令的使用方法如下:1. 判断条件在使用条件转移指令之前,需要先判断特定条件是否满足。
条件通常是通过比较指令来实现的,比如CMP指令可以比较两个操作数的大小关系,并设置相应的标志位。
2. 编写条件转移指令根据需要跳转的条件,选择相应的条件转移指令,并将跳转的目标地址作为操作数填写到指令中。
3. 执行条件转移指令当条件转移指令被执行时,会根据特定条件判断是否跳转到目标地址。
如果条件满足,则跳转到目标地址继续执行,否则继续执行下一条指令。
四、示例代码下面是一个简单的示例代码,演示了如何使用条件转移指令实现一个简单的分支结构:```MOV AX, 5CMP AX, 10JL less_thanMOV BX, 10JMP endless_than:MOV BX, 5end:```该代码首先将AX寄存器的值设置为5,然后使用CMP指令比较AX的值和10的值。
转移指令的原理可以修改IP,或者同时修改cs和ip的指令统称为转移指令。
8086cpu的转移⾏为有以下⼏类:只修改ip,称为段内转移,如jmp ax同时修改cs和ip,称为段间转移,如jmp 1000:0根据转移指令对于ip的修改范围不同,所以段内转移⼜分为:短转移和近转移短转移IP的修改返回为-128~127近转移IP的修改范围为-32768~327678086cpu的转移指令分为以下⼏类:⽆条件转移指令(如:jmp)条件转移指令(jcxz)循环指令(loop)过程中断不同转移指令的转移条件可能不同,但是转移的基本原理是相同的操作符offsetoffset是在汇编语⾔中是由编译器处理的符号,功能为取得标号的偏移地址。
也就是相对于代码段的偏移地址,就是直接IP值了。
jmp指令jmp为⽆条件转移指令,可以只修改IP,也可以同时修改cs和ip。
jmp指令需要给出两种信息:转移的⽬的地址转移的距离(段间转移,段内短转移,段内近转移)不同的给出⽬的地址的⽅法不同,和不同的转移位置,对应有不同格式的jmp指令。
依据位移进⾏转移的jmp指令1. jmp short 标号 (IP)=(IP)+8位位移这种格式的jmp指令实现的是段内短转移。
对ip的修改范围限定为-128~127之间,可以看出正好是⼀个字节能够表⽰的范围。
2. jmp near ptr 标号 (IP)=(IP)+16位位移于jmp short功能相同,只不过他实现的是段内近转移。
简单来说就是转移的距离拉长(虽然仍然是在段内)⼩贴⼠:可以看到jmp short与jmp near ptr(段内转移)并没有直接将转移的⽬的地址直接写⼊机器指令中。
⽽是将⼀个相对偏移地址写⼊了机器指令。
(但是debug在对应的汇编指令中会看到偏移地址)具体来说就是将标号地址相对于jmp指令的下⼀条指令的地址写⼊了机器指令。
也就是说,cpu在执⾏jmp指令的时候并不需要转移的⽬标地址。
汇编语⾔第九章转移指令的原理转移指令:可以修改IP,或者同时修改CS和IP的指令称为转移指令。
只修改IP时,称为段内转移,段内转移根据IP的修改范围⼜分为短转移(short)和近转移(near);短转移IP的修改范围为8位补码表⽰的范围:-128~127.近转移IP的修改范围为16位补码表⽰的范围:-32768~32767(向前为负,向后为正)同时修改IP和CS时,称为段间转移,⼜称远转移(far)。
转移指令分类:1. ⽆条件转移指令,jmp,其他转移指令⼤多可以基于jmp写出2. 有条件转移指令,jcxz3. 循环转移指令,loop4. 过程5. 中断操作符offset:offset的功能是获取标号的偏移地址EA,标号指的是s、start、data⼀类的名称。
⽆条件转移指令jmp:jmp给出的两种信息:转移的⽬的地址,由标号给出转移的距离(段间转移,段内短转移short,段内近转移near)1. 短转移、近转移jmp指令jmp short 标号(该指令本⾝占两个字节)翻译成机器码为 EBXX,XX为转移位移量的补码表⽰,向前为负向后为正。
没有表达出绝对的⽬的地址,只给出了相对的位移。
位移量XX = 标号处的地址 - jmp指令后⼀个字节的地址,short指明位移量为8位。
(IP)=(IP)+ XX()8位位移类似的还有 jmp near ptr 标号(也可写成jmp s 省略near ptr)(该指令本⾝占三个字节)翻译成机器码为 E9XXXX 其位移量⽤两个字节表⽰,ptr可以看作是长度声明。
(IP)=(IP) + XXXX 16位位移2.远转移jmp指令jmp far ptr 标号(该指令本⾝占五个字节)翻译成机器码为 EAXXXX YYYY,XXXX为偏移地址,前两个X为低位,后两个X为⾼位;YYYY 为段地址,前两个Y为低位,后两个Y为⾼位。
向前转移:编译器中有⼀个地址计数器AC,编译器读到标号s时记下AC的值as,读到jmp时记下AC的值aj,再⽤aj - ac算出位移量disp-128 < disp < 127 时,近转移、远转移统统转化成短转移,机器码为EB disp(占两个字节)disp超出上述范围,得⽤16位补码表⽰时,短转移将产⽣编译错误,近转移和远转移正常执⾏向后转移:向后转移时,编译器先读到jmp指令,记下aj,但没有as,⼀时⽆法计算位移量disp,这时会对jmp指令进⾏⼀个预处理,预处理不管转移类型,统⼀当作短转移,但预留的空间不同对于短转移,编译器⽣成EB和1个nop指令,相当于预留⼀字节,⽤于存放8位disp对于近转移,编译器⽣成EB和2个nop指令,相当于预留两字节,⽤于存放16位disp对于远转移,编译器⽣成EB和4个nop指令,相当于预留四字节,⽤于存放段地址和偏移地址当编译器往后读到as时,计算disp = as - aj-128 < disp < 127 时,近转移、远转移统统转化成短转移,机器码为EB disp,多余的预留空间闲置disp超出上述范围,得⽤16位补码表⽰时,短转移将产⽣编译错误,近转移和远转移正常执⾏,在预留的位置添上相应代码即可3.转移信息在寄存器或者内存中的jmp指令jmp 16位寄存器(只能是16位寄存器,因为相当于mov ip ,res,寄存器位数要对应)。