汇编语言-其他转移指令CALL
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言-其他转移指令CALL相关的知识,希望对你有一定的参考价值。
参考技术A jcxz指令格式: jcxz标号
功能: 如果cx=0 则转移标出处执行
当cx!=0 什么也不做(程序向下执行)
根据位移进行相对转移的意义
jmp short标号
jmp near ptr标号
jcxz标号
loop标号
在它们对应的机器码中不包含转移的目的地址,而包含的是到目的地址的位移。
1、如果loop s的机器码中包含的是s的地址,则就对程序段在内存中的偏移地址有了严格的限制,易引发错误。
2、当机器码中包含的是转移的位移,无论s处的指令地址是多少,loop指令转移的相应位移是不变的。
mov ax,0
call s
mov ax,4c00h
int 21h
s:add ax,1
ret
调用子程序call指令
返回 ret指令
实质: 流程转移指令,它们都修改IP,或同时修改CS和IP
格式call 标号
cpu执行call指令,进行两步操作,call指令调用之后话牵扯到一个返回(ret)的问题,执行完标号处指令,怎么返回到当前调用的call 标号 处去执行下一条指令呢?
(1)将当前的ip或cs和ip压入栈中
(2)转移到标出执行指令
16位位移= “标号”处的地址-call指令后的第一个字节的地址
16位位移的范围为[-32768,32767] 用补码表示
16位移由编译程序在编译时算法。
call word ptr内存单元地址word = 字(16位)
相当于push ip
jmp word ptr内存单元地址
mov sp,10h
mov ax,0123h
mov ds:[0],ax
call word ptr ds:[0]
执行后(ip)=0123H (sp)=0EH
call dword ptr内存单元地址dword双字(32位)
返回指令ret和retf
call和ret和retf配合使用
例:计算2的n次方,计算前n的值由cx提供。
assume cs:code
codeseg ment
start:
mo ax,2
mov cx,3
call s
mov bx,ax
mov ax,4c00h
int 21h
s:add ax,ax
loop s
ret
这个例子虽然可以完成功能,但是没有栈这样会产生安全问题,而且ret是用于栈中的
例: 为call和ret指令设置栈
assume cs:code,ss:stack
stack segment
db 8 dup(0)
db 8 dup(0)
stack ends
code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,1000
call s
mov ax,4c00h
int 21h
s:add ax,ax
ret
code ends
end start
8086汇编 call 指令
8086汇编 call 指令
字面意思:调用子程序
实质:流程转移指令,它们都修改IP,或同时修改CS和IP
call指令实现转移的方法和 jmp 指令的原理相似
格式:call 标号
返回指令:ret、retf
call 指令说明
CPU执行call指令,进行两步操作:
(1)将当前的 IP 或 CS和IP 压入栈中;
(2)转移到标号处执行指令。
call 标号:
- 16位位移=“标号”处的地址-call指令后的第一个字节的地址;
- 16位位移的范围为 -32768~32767,用补码表示;
- 16位位移由编译程序在编译时算出。
CPU执行“call far ptr 标号”时的操作:
(1) (sp) = (sp) – 2
((ss) ×16+(sp)) = (CS)
(sp) = (sp) – 2
((ss) ×16+(sp)) = (IP)
(2) (CS) = 标号所在的段地址
(IP) = 标号所在的偏移地址
CPU执行“call near ptr 标号”时的操作:
“call 标号”类似”jmp near ptr 标号”,对应的机器指令中为相对于当前IP的转移位移,而不是转移的目的地址,实现段内转移。指令“call far ptr 标号”实现的是段间转移!
ret、retf
使用案例
1、案例模板
说明:在程序走到call s时会直接跳转到 s: add ax, 1 这里列处理返回值ret以上指令当遇到ret后会返回到 mov ax, 4c00h 行接着往下执行。
mov ax, 0 ; 使用主程序 s call s mov ax, 4c00h int 21h ; 创建主程序s s: add ax, 1 ; 返回 ret
以上是关于汇编语言-其他转移指令CALL的主要内容,如果未能解决你的问题,请参考以下文章