博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
汇编语言笔记10-CALL和RET指令
阅读量:4490 次
发布时间:2019-06-08

本文共 2758 字,大约阅读时间需要 9 分钟。

 转载必须注明出处,违者必究。

模块化程序设计

  1. 模块化程序设计

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

  2. 子程序的框架
    1 assume cs:code 2 code segment 3     main:     : 4               : 5               call sub1          ; 调用子程序sub1 6               : 7               : 8               mov ax, 4c00h 9               int 21h10     11     sub1:     :                  ; 子程序sub1开始12               :13               call sub2          ; 调用子程序sub214               :15               :16               ret                ; 子程序返回17      18     sub2:     :                  ; 子程序sub2开始19               :20               :21               ret                ; 子程序返回22 code ends23 end main

     

callret指令

指令

功能

汇编语法解释

备注

ret

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

实现近转移。

pop IP

  

retf

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

实现远转移。

pop IP

pop CS

  

retn

  

pop IP

add sp, n

见后面

   

   

   

   

   

call

   

   

   

   

call指令分为两步:

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

(2) 转移。

格式

汇编语法解释

call 标号

push IP

jmp near ptr 标号

call far 标号

push CS

push IP

jmp far ptr 标号

call 16reg

push IP

jmp 16reg

call word ptr 内存单元地址

push IP

jmp word ptr 内存单元地址

call dword ptr 内存单元地址

push CS

push IP
jmp dword ptr 内存单元地址

   

   

   

call

   

muldiv指令

指令格式

解释

示例

mul reg

mul 内存单元

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

(2)16位乘法:默认乘子一个放在AX中,另一个放在16reg或者内存字单元中。默认结果放在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中,除数放在8reg或者内存字节单元中。结果AL()AH(余数)

(2)32/16: 被除数默认DX|AX中,除数放在16reg或者内存字单元中。结果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)的余数

   

参数和结果传递

位置

优点

缺点

示例

   

   

   

放在寄存器中

   

   

   

最常见的方法

快速

   

   

   

寄存器数量有限,

寄存器可能会冲突

; 说明:计算N3次方

; 参数: (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 bp10              mul bp11              pop bp12              ret 4              ; 弹出参数(将栈顶指针修改为调用前的值)13     14 ;指令ret n的含义:15 ;    pop ip16 ;    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 }

                

转载于:https://www.cnblogs.com/dennisOne/archive/2012/10/23/2735247.html

你可能感兴趣的文章
[Luogu 3902]Increasing
查看>>
clear语句处理不同类型的数据结果
查看>>
HDU 6118 度度熊的交易计划(费用流)
查看>>
UrlEncode编码/UrlDecode解码使用方法
查看>>
使用ubuntu作为web开发环境的一些感受
查看>>
easyui-datagrid 自适应列宽问题
查看>>
OO第一次总结
查看>>
VS2012发布网站详细步骤
查看>>
文件下载隐匿执行
查看>>
【导图控】各软件开发版本详解
查看>>
HDU 1533 Going home
查看>>
箭头函数
查看>>
SharePoint【ECMAScript对象模型系列】-- 11. Enable/Disable Ribbon上的Button
查看>>
C#委托-怎样理解C#中“委托”的含义和用途
查看>>
Spring数据访问1 - 数据源配置及数据库连接池的概念
查看>>
setting.xml配置详解
查看>>
window系统下调度数据库类型资源库中的kettle job
查看>>
10、小易记单词--2017网易春招
查看>>
monkey 命令详解
查看>>
Scrapy XPath语法
查看>>