汇编语言笔记 CALL和RET指令

时间:2014-10-07 13:18:53   收藏:0   阅读:228

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

 

 

?模块化程序设计

  1. 模块化程序设计

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

  2. 子程序的框架
    bubuko.com,布布扣
     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
    bubuko.com,布布扣

     

?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语言的方式

简单方便

  

详细解释

   

评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!