☞模块化程序设计

  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 }

                

汇编语言笔记10-CALL和RET指令相关推荐

  1. 王爽 《汇编语言》 读书笔记 十 CALL和RET指令

    第十章 CALL和RET指令 call和ret都是转移指令,它们都修改IP,或同时修改CS和IP,常用于子程序的设计. 10.1 ret 和 retf ret用栈中的数据,修改IP的内容,从而实现近转 ...

  2. 王爽老师汇编语言第四版第十章CALL和RET指令——小白笔记

    目录 10.1 ret和retf (1)  ret: (2)retf: 10.2 call指令 10.3依据位移进行转移的CALL指令 10.4 转移的目的地址在指令中的CALL指令 10.5转移地址 ...

  3. 汇编语言笔记(10)CALL和RET指令

    call和ret指令都是转移指令,它们都修改IP,或者同时修改CS和IP ret和reft ret指令用栈中的数据,修改IP的内容,从而实现近转移: retf指令用栈中的数据,修改CS和IP的内容,从 ...

  4. 王爽 汇编语言第三版 第10章 call 和 ret 指令 以及 子程序设计

    第10章 call 和 ret 指令 10.1 ret 和 reft 指令 call 和 ret 指令都是转移指令,他们都修改 IP,或同事修改 CS 和 IP .他们经常被共同来实现子程序的设计. ...

  5. 汇编语言(第三版)第十章 CALL 和 RET 指令 笔记

    call 和 ret 都是可以改变 ip 或是 cs 和 ip .经常用来实现子程序设计. 10.1 ret 和 retf ret指令用栈中的数据,修改IP实现近转移 retf指令用栈中的程序,修改c ...

  6. 《汇编语言》第10章 call和ret指令

    call和ret指令都是转移指令,经们都修改IP,或同时修改CS和IP.它们经常被共同用来实现子程序的设计.这一章,我们讲解call和ret指令的原理. 10.1 ret和retf ret指令用栈中的 ...

  7. 汇编语言——第10章 CALL和RET指令

    目录 引言 10.1 ret和retf 检测点10.1 10.2 call指令 10.3 依据位移进行转移的call指令 检测点10.2 10.4 转移的目的地址在指令中的call指令 检测点10.3 ...

  8. call指令和ret指令【笔记+详解】

    笔记目录 call指令和ret指令[笔记] 1 引子 2 call和ret的简单运用 3 call指令本质含义详解 4 ret指令 5 总结及汇编环境资源 call指令和ret指令[笔记] 1 引子 ...

  9. 《汇编语言》第十章 call 和 ret 指令

    call指令和ret指令都是转移指令,它们都修改IP,或同时修改CS和IP,它们经常被共同用来实现子程序的设计 10.1 ret 和 retf ret指令用栈中的数据,修改IP的内容,从而实现近转移 ...

最新文章

  1. 低数值精度推理和训练
  2. 京东金融App收集用户敏感信息?致歉来了
  3. css03层次选择器
  4. Spring AOP中定义切点(PointCut)和通知(Advice)
  5. 【JVM性能调优】jstack和线程dump分析
  6. JAVA程序设计----练习题
  7. python学习总结----时间模块 and 虚拟环境(了解)
  8. c#课程设计简单题目_《C#项目案例》课程设计题目
  9. Linux笔记-centos7配置网卡及iftop的使用
  10. Qt工作笔记-QML自定义圆形进度条(C++后端处理数据)
  11. 爬虫-ProxyHandler代理类-通过代理发起请求
  12. JFreeChart柱状图单组柱子的不同颜色显示
  13. BarnBridge出现前端错误
  14. C#中根据传入的字符串字段返回实体Lambda表达式
  15. 数控加工中心编程和UG编程和什么区别
  16. c++ 取模和求余运算
  17. 51单片机--时钟芯片ds1302
  18. 2021裁判文书网抓取
  19. 命令行基础-vim编辑器
  20. php guzzlehttp,PHP 使用 Guzzle 发送 HTTP 请求

热门文章

  1. hdu4122 制作月饼完成订单的最小花费
  2. C语言经典例22-乒乓球比赛名单问题
  3. 【C 语言】结构体 ( 结构体类型变量初始化 | 定义变量时进行初始化 | 定义隐式结构体时声明变量并初始化 | 定义普通结构体时声明变量并初始化 )
  4. 【C 语言】文件操作 ( 学生管理系统 | 命令行接收数据填充结构体 | 结构体写出到文件中 | 查询文件中的结构体数据 )
  5. 【Google Play】管理目标受众群体 ( 加入“亲子同乐计划“ 由于政策原因 “更新被拒“ 后的处理 )
  6. 【Android NDK 开发】JNI 动态注册 ( 动态注册流程 | JNI_OnLoad 方法 | JNINativeMethod 结构体 | GetEnv | RegisterNatives )
  7. css 垂直居中的几种方式
  8. [docker] 04 使用docker容器
  9. Protocol Buffer搭建及示例
  10. ASP.NET MVC笔记