汇编语言——call 和 ret 指令

一、ret 和 retf

我们用汇编语法来解释ret和retf指令,则:

CPU执行ret指令时,相当于进行:

  • pop IP

CPU执行retf指令时,相当于进行:

  • pop IP(一般IP都是在低位地址的)
  • pop CS(CS在高位地址)

二、call指令

CPU执行call指令,进行两步操作:

(1)将当前的 IP 或 CS和IP 压入栈中;

(2)转移。

call 指令不能实现段内短转移,除此之外,call指令实现转移的方法和 jmp 指令的原理相同,下面的几个小节中 ,我们以给出转移目的地址的不同方法为主线,讲解call指令的主要应用格式。

段内转移

指令格式:call 标号

CPU执行上面指令相当于进行:

push IP

jmp near ptr 标号

段间转移

指令格式:call far ptr 标号

CPU 执行上面指令时,相当于进行:

push CS

push IP

jmp far ptr 标号

转移地址在寄存器中的call指令

指令样式:call 16位寄存器

CPU执行以上指令时,相当于进行:

push IP

jmp 16位寄存器

转移地址在内存中的call指令

(1) call word ptr 内存单元地址

汇编语法解释:

push IP

jmp word ptr 内存单元地址

(2) call dword ptr 内存单元地址

汇编语法解释:

push CS

push IP

jmp dword ptr 内存单元地址

mul指令

mul是乘法指令,使用 mul 做乘法的时候:

(1)相乘的两个数:要么都是8位,要么都是16位。

8 位: AL中和 8位寄存器或内存字节单元中;

16 位: AX中和 16 位寄存器或内存字单元中。

使用mul座乘法的时候:

(2)结果

8位:AX中;

16位:DX(高位)和AX(低位)中。

(3)指令样式

mul reg

mul 内存单元

(4)内存单元可以用不同的寻址方式给出

mul byte ptr ds:[0]

含义为: (ax)=(al)*((ds)*16+0);

mul word ptr [bx+si+8]

含义为:

(ax)=(ax)*((ds)*16+(bx)+(si)+8)结果的低16位;

(dx)=(ax)*((ds)*16+(bx)+(si)+8)结果的高16位;

示例:计算100*10000

100小于255,可10000大于255,所以必须做16位乘法,程序如下:

mov ax,100

mov bx,10000

mul bx

结果: (ax)=4240H,(dx)=000FH(F4240H=1000000)

方法一:

方法二:一直jmp,等到cx的值为0的时候使用jcxz跳出循环(好处,不用我们设置cx的大小了)

方法三:寄存器是有限的,so我们可以使用栈来存放数据

 1 capital: push cx
 2          push si
 3
 4  change: mov cl,[si]
 5          mov ch,0
 6          jcxz ok
 7          and byte ptr [si],11011111b
 8          inc si
 9          jmp short change
10
11      ok: pop si
12          pop cx
13          ret
时间: 2024-10-29 07:44:36

汇编语言——call 和 ret 指令的相关文章

汇编语言---call和ret指令

汇编语言--call和ret指令 call和ret指令 call和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP. 它们经常被共同用来实现子程序的设计. ret和retf ret指令用栈中的数据,修改IP的内容,从而实现近转移: retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移. CPU执行ret指令时,进行下面的两步操作: (1)(IP) = ((ss)*16 +(sp)) (2)(sp) = (sp)+2 CPU执行retf指令时,进行下面四步操作: (1)(IP

汇编语言笔记 CALL和RET指令

转载地址:http://www.cnblogs.com/dennisOne ?模块化程序设计 模块化程序设计 汇编语言通过call和ret指令实现了模块化程序设计.可以实现多个相互联系.功能独立的子程序来解决一个复杂的问题. 子程序的框架 1 assume cs:code 2 code segment 3 main: : 4 : 5 call sub1 ; 调用子程序sub1 6 : 7 : 8 mov ax, 4c00h 9 int 21h 10 11 sub1: : ; 子程序sub1开始

CALL和RET指令

1.call和ret指令都是转移指令,它们都修改IP的值,或同时修改CS和IP的值.它们经常共同用语实现子程序的设计. 2.ret指令用栈中的数据,修改IP的内容,从而实现近转移. 3.retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移. 4.CPU执行ret指令时, (1)(IP)=((ss)*16+(sp)) (2)(sp)=(sp)+2 相当于进行:pop IP 执行retf指令时, (1)(IP)=((ss)*16+(sp)) (2)(sp)=(sp)+2 (3)(CS)=(

自己总结:汇编CALL和RET指令

ret指令,相当于 pop IP:修改IP的内容,从而实现近转移 retf指令,相当于 pop IP pop CS:修改CS和IP的内容,从而实现远转移 -------------- CPU执行call指令时,进行两步操作: 1.将当前的IP或者CS和IP压入栈中: 2.转移 call指令不能实现短转移 "call  标号",这种用法是将该指令后的第一个字节的偏移地址入栈,再转到标号处执行指令

汇编-10.0-CALL和RET指令

call和ret指令都是转移指令,他们都是修改IP,或同时修改CS和IP.它们常被共同用来实现子程序设计. 1.ret和retf ret指令用栈中的数据,修改IP的内容,从而实现近转移: retf指令用栈中的数据,修改CS和IP的内容,从而实现远转移: CPU执行ret指令时,进行下面两步操作: (1).(IP)=((ss)*16+(sp)) (2).(sp)=(sp)+2 用汇编语法解释,相当于: pop IP CPU执行retf指令时,进行下面4步操作: (1).(IP)=((ss)*16+

第10章 CALL和RET指令

call 和 ret 指令都是转移指令,它们都修改IP ,或者同时修改CS 和IP .他们经常被共同用来修改实现子程序的设计. 10.1 ret 和 retf ret指令用栈中的数据,修改Ip的内容,从而实现近转移. retf 指令用栈中的数据,修改CS 和 IP 的内容,从而实现远转移. cpu执行 ret 指令时相当于  POP IP CPU 执行 retf指令时 相当于进行 POP IP pop CS cpu 执行call 指令时,实现俩步操作: 将当前的IP或者CS 和IP压入栈中 转移

汇编语言——[bx]和loop指令

[bx] 由于在编译器中mov AX,[0]指令会被编译器认为是mov AX,0所以引入[bx]的概念 mov [bx],AX的意思是将(ds)*16+(bx)内存位置的值赋给AX 用法和之前的ds[address]一样 小Tips 1 ; [bx]的使用方法 2 mov ax,1000H 3 4 mov bx,2000H 5 6 mov ds,ax ; 将ds数据段寄存器赋值为2000H 7 8 mov [bx],ax ; 将ax寄存器的值赋给内存单元21000H位置 9 10 ; 其他方式

汇编语言 [BX]和loop指令

一      .[bx] 1. mov ax,[bx] bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中. 2. mov [bx],ax bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将ax中的数据送入内存SA:EA处. 3. inc bx 其表示的含义是bx中的内容加1,比如下面两条指令: mov bx,1 inc bx 执行之后的结果,bx=2. 二     loop指令 1.  cx中的值影响着loop指令的执行结果.我们用loo

汇编语言:浮点数传送指令

1.FLD 指令格式: FLD STReg/MemReal 指令功能: 将浮点数据压入协处理器的堆栈中.当进行内存单元内容压栈时,系统会自动决定传送数据的精度.比如:用DD或REAL4定义的内存单元数值是单精度数等. STReg是处理器堆栈寄存器ST(0)~ST(7). 例如: .387 data1  DWORD 123, -543 data2  REAL8 -321.5 data3  REAL10 2.5 …… FLD  data1  ;压一个单精度数据进栈 FLD  data2  ;压一个双