教学提示 在学习和应用汇编语言进行 程序设计时,有一些经常遇 到的问题,例如算术运算、 代码转换等,需要掌握
教学提示 在学习和应用汇编语言进行 程序设计时,有一些经常遇 到的问题,例如算术运算、 代码转换等,需要掌握
3.2.5控制转移类指令 ■控制转移类指令用于实现分支、循环、过程等 程序结构,是仅次于传送指令的最常用指令 重点掌握:JMP/ XX/LOOP CALL/RET INTn/IRET常用系统功能调用 般了解 LOOPZ/LOOPNZ INTO ●控制转移类指令通过改变|P(和cS) 值,实现程序执行顺序的改变
3.2.5 控制转移类指令 ◼ 控制转移类指令用于实现分支、循环、过程等 程序结构,是仅次于传送指令的最常用指令 重点掌握:JMP/Jxx/LOOP CALL/RET INT n/IRET 常用系统功能调用 一般了解: LOOPZ/LOOPNZ INTO 控制转移类指令通过改变IP(和CS) 值,实现程序执行顺序的改变
UMP 无条件转移指令 JMP1abel,程序转向e情的地 只要执行无条件转移指令JMP,就使程序转到指定 的目标地址处,从目标地址处开始执行那里的指令 操作数labe是要转移到的目标地址(目的地址、转 移地址) JP指令分成4种类型: (1)段内转移、直接寻址 (2)段内转移、间接寻址 (3)段间转移、直接寻址 (4)段间转移、间接寻址
一 无条件转移指令 ◼ 只要执行无条件转移指令JMP,就使程序转到指定 的目标地址处,从目标地址处开始执行那里的指令 ◼ 操作数label是要转移到的目标地址(目的地址、转 移地址) ◼ JMP指令分成4种类型: ⑴ 段内转移、直接寻址 ⑵ 段内转移、间接寻址 ⑶ 段间转移、直接寻址 ⑷ 段间转移、间接寻址 JMP label ;程序转向label标号指定的地址 JMP
UMP 目标地址的寻址用标号表达 ■直接寻址方式 ■转移地址象立即数一样,直接在指令的 机器代码中,就是直 用寄存器或存储器 间接寻址方式 操作数表达 转移地址在寄存器或主存单元中,就是 通过寄存器或存储器的间接寻址方式
目标地址的寻址方式 ◼ 直接寻址方式 ◼ 转移地址象立即数一样,直接在指令的 机器代码中,就是直接寻址方式 ◼ 间接寻址方式 ◼ 转移地址在寄存器或主存单元中,就是 通过寄存器或存储器的间接寻址方式 用标号表达 用寄存器或存储器 操作数表达 JMP
UMP 目标地址的范围:段内 段内转移——近转移(near) 在当前代码段64KB范围内转移 (±32KB范围) 不需要更改CS段地址,只要改变IP偏 移地址 代码段代码段 段内转移——短转移( short) ■转移范围可以用一个字节表达,在段 内-128~+127范围的转移
目标地址的范围:段内 ◼ 段内转移——近转移(near) ◼ 在当前代码段64KB范围内转移 ( ±32KB范围) ◼ 不需要更改CS段地址,只要改变IP偏 移地址 ◼ 段内转移——短转移(short) ◼ 转移范围可以用一个字节表达,在段 内-128~+127范围的转移 代 码 段 代 码 段 JMP
化解藏图,段间 从当前代码段跳转到另一个代码 段,可以在1MB范围 代 码 需要更改CS段地址和IP偏移地址 段 实际编程时,汇编程序会根据目标地址的距离, 自动处理成短转移、近转移或远转移 程序员可用操作符 short、 near ptr或 ifar ptr强制
目标地址的范围:段间 ◼ 段间转移——远转移(far) ◼ 从当前代码段跳转到另一个代码 段,可以在1MB范围 ◼ 需要更改CS段地址和IP偏移地址 ◼ 目标地址必须用一个32位数表达, 叫做32位远指针,它就是逻辑地 址 代 码 段 代 码 段 实际编程时,汇编程序会根据目标地址的距离, 自动处理成短转移、近转移或远转移 程序员可用操作符short、near ptr 或far ptr 强制 JMP
实际为相对寻址 段内转移、直接寻址 JMP label IP←IP+位移量 ■位移量是紧接着JMP指令后的那条指令的偏移地址,到目 标指令的偏移地址的地址位移 当向地址增大方向转移时,位移量为正;向地址减小方向 转移时,位移量为负 Jmp again ;转移到 again处继续执行 again dec cx ;标号 again的指令 jmp output ;转向 output output: mov result, al 标号 output的指令
JMP 段内转移、直接寻址 JMP label ;IP←IP+位移量 ◼ 位移量是紧接着JMP指令后的那条指令的偏移地址,到目 标指令的偏移地址的地址位移 ◼ 当向地址增大方向转移时,位移量为正;向地址减小方向 转移时,位移量为负 jmp again ;转移到again处继续执行 …… again: dec cx ;标号again的指令 …… jmp output ;转向output …… output: mov result,al ;标号output的指令 实际为相对寻址
UMP 段内转移、间接寻址 JMP r16/m16 IP←r16/m16 ■将一个16位寄存器或主存字单元内容送入IP寄存器, 作为新的指令指针,但不修改CS寄存器的内容 Jmp ax ;IP←AX jmp word ptr [2000h] IP←[2000h
段内转移、间接寻址 JMP r16/m16 ;IP←r16/m16 ◼ 将一个16位寄存器或主存字单元内容送入IP寄存器, 作为新的指令指针,但不修改CS寄存器的内容 jmp ax ;IP←AX jmp word ptr [2000h] ;IP←[2000h] JMP
UMP 段间转移、直接寻址 JMP far ptr label IP← label的偏移地址 CS←1abel的段地址 ■将标号所在段的段地址作为新的CS值,标号在该 段内的偏移地址作为新的IP值;这样,程序跳转到 新的代码段执行 mp far ptr otherseg ;远转移到代码段2的 otherseg
段间转移、直接寻址 JMP far ptr label ;IP←label的偏移地址 ;CS←label的段地址 ◼ 将标号所在段的段地址作为新的CS值,标号在该 段内的偏移地址作为新的IP值;这样,程序跳转到 新的代码段执行 jmp far ptr otherseg ;远转移到代码段2的otherseg JMP
UMP 段间转移、间接寻址 JMP far ptr mem IP←[mem,CS←[mem+2 用一个双字存储单元表示要跳转的目标地址。这 个目标地址存放在主存中连续的两个字单元中的, 低位字送IP寄存器,高位字送CS寄存器 mov word ptr [bx, 0 mov word ptr [bx+2, 1500h JMP far ptr[bx];转移到1500h:0
段间转移、间接寻址 JMP far ptr mem ;IP←[mem],CS←[mem+2] ◼ 用一个双字存储单元表示要跳转的目标地址。这 个目标地址存放在主存中连续的两个字单元中的, 低位字送IP寄存器,高位字送CS寄存器 mov word ptr [bx],0 mov word ptr [bx+2],1500h JMP far ptr [bx] ;转移到1500h:0 JMP