汇编语言笔记 CALL和RET指令

转载地址:http://www.cnblogs.com/dennisOne

?模块化程序设计

  1. 模块化程序设计

    汇编语言通过call和ret指令实现了模块化程序设计。可以实现多个相互联系、功能独立的子程序来解决一个复杂的问题。

  2. 子程序的框架

     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开始
    12               :
    13               call sub2          ; 调用子程序sub2
    14               :
    15               :
    16               ret                ; 子程序返回
    17
    18     sub2:     :                  ; 子程序sub2开始
    19               :
    20               :
    21               ret                ; 子程序返回
    22 code ends
    23 end main

?call和ret指令


指令


功能


汇编语法解释


备注


ret


用栈中的数据,修改IP的内容,

实现近转移。


pop IP


retf


用栈中的数据,修改CS和IP的内容,

实现远转移。


pop IP

pop CS


retn


pop IP

add sp, n


见后面


call


call指令分为两步:

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

(2) 转移。


格式


汇编语法解释


call 标号


push IP

jmp near ptr 标号


call far 标号


push CS

push IP

jmp far ptr 标号


call 16位reg


push IP
jmp 16位reg


call word ptr 内存单元地址


push IP
jmp word ptr 内存单元地址


call dword ptr 内存单元地址


push CS
push IP
jmp dword ptr 内存单元地址


call

?mul和div指令


指令格式


解释


示例


mul reg

mul 内存单元


(1) 8位乘法:默认乘子一个放在AL中,另一个放在8位reg或者内存字节单元中。默认结果放在AX中

(2)16位乘法:默认乘子一个放在AX中,另一个放在16位reg或者内存字单元中。默认结果放在DX|AX中。


mul byte ptr ds:[0]

; (ax)=(al)*((ds)*16+0)

mul word ptr [bx+si+8]

; (dx|ax)=(ax)*((ds)*16+(bx)+(si)+8)


div reg

div 内存单元


(1)16位/8位: 被除数默认放在AX中,除数放在8位reg或者内存字节单元中。结果AL(商),AH(余数)。

(2)32位/16位: 被除数默认DX|AX中,除数放在16位reg或者内存字单元中。结果AX(商), DX(余数)。

(3)会产生越界问题(如何设计安全的div见后面)


div byte ptr ds:[0]
; (al) = (ax)/((ds)*16+0)的商
; (ah) = (ax)/((ds)*16+0)的余数

div word ptr [bx+si+8]

; (ax)=(ax)/((ds)*16+(bx)+(si)+8)的商

; (dx)=(ax)/((ds)*16+(bx)+(si)+8)的余数

?参数和结果传递


位置


优点


缺点


示例


放在寄存器中


最常见的方法

快速


寄存器数量有限,

寄存器可能会冲突


; 说明:计算N的3次方

; 参数: (bx)=N

; 结果: (dx:ax)=N^3

cube:        mov ax, bx

mul bx

mul bx

ret


放在数据段中


批量数据的传递


速度慢


; ds:si指向字符串(批量数据)所在空间的首地址

; cx存放字符串的长度

capital:        and byte ptr [si], 11011111b

inc si

loop capital

ret


放在栈中


C语言的方式

简单方便


详细解释

  • 附1:用栈传递参数

    结合C语言的函数调用来学习栈传递参数的思想。

     1 ; 说明:计算(a-b)^3,a、b为字型数据
     2 ; 参数:进入子程序时候,栈顶存放IP,后面依次存放a、b
     3 ; 结果:(dx:ax)=(a-b)^3
     4 difcube:    push bp
     5              mov bp, sp
     6              mov ax, [bp+4]     ;将栈中a的值送入ax中
     7              sub ax, [bp+6]     ; a-b
     8              mov bp, ax
     9              mul bp
    10              mul bp
    11              pop bp
    12              ret 4              ; 弹出参数(将栈顶指针修改为调用前的值)
    13
    14 ;指令ret n的含义:
    15 ;    pop ip
    16 ;    add sp,n 

    使用栈进行参数传递,所以调用者在汇编程序的时候要向栈中压入参数,子程序在返回的时候可以使用ret n指令将栈顶指针修改为调用前的值。

  • 附2: C语言处理方式(局部变量,也是使用栈)

     1 void add(int, int, int);
     2
     3 void main()
     4 {
     5     int a = 1;
     6     int b = 2;
     7     int c = 0;
     8     add(a, b, c);
     9     c++;
    10 }
    11
    12 void add(int a, int b, int c)
    13 {
    14      c = a + b;
    15 }

                

时间: 2024-10-11 13:20:16

汇编语言笔记 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 指令

一.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和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)=(

Linux学习笔记——如何使用echo指令向文件写入内容

0.前言 本文总结如何使用echo命令向文件中写入内容,例如使用echo指令覆盖文件内容,使用echo指令向文件追加内容,使用echo指令往文件中追加制表符. echo向文件中输出内容的基本方法是使用IO重定向指令--">",默认情况下echo输出到标准输出中,使用>指令可重定向输出到文件中. 1.echo指令基本用法 [1]Linux官方用户手册--echo指令 [2]输入指令获得帮助 sudo echo --help 返回内容如下 用法:echo [短选项]... [字

自己总结:汇编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压入栈中 转移

《汇编语言》学习笔记8——基本汇编指令

1.基本汇编指令 1.传送指令:MOV 格式:MOV OPD,OPS 操作:将OPS的值传送到OPD中 注意事项: 1.OPD不能是CS 2.不允许在两个存储单元之间传送 3.MOV影响所有标志位 4.OPD.OPS的数据类型要一致 5.OPD为CS时,OPS不能为立即数 2.进栈指令:PUSH 格式:PUSH OPD 操作:1.SP←SP-1 2.将OPD的高字节进栈 3.SP←SP-1 4.放入低字节 注意事项: 1.OPD必须为16位字 2.OPD不能为立即数 3.每次进栈后地址-2 4.

汇编语言笔记 转移指令的原理

原文地址:   http://www.cnblogs.com/dennisOne ?8086CPU转移指令分类 无条件转移指令(如:jmp) 条件转移指令 循环指令(如:loop) 过程 中断 ?操作符offset offset在汇编语言中是由汇编器处理的符号,它的功能是取标号的偏移地址. ?jmp指令 类型 功能 示例 jmp short 标号 (段内短转移) assume cs:code code segment start: mov ax, 0 jmp short s add ax, 1