汇编学习笔记(7)call和ret指令
ret和retf
CPU执行ret指令时进行以下两步操作:
(IP)=((ss)*16+(sp))
(sp)=(sp)+2
这相当于pop IP
CPU执行retf指令时进行以下四步操作:
(IP)=((ss)*16+(sp))
(sp)=(sp)+2
(cs)=((ss)*16+(sp))
(sp)=(sp)+2
这相当于pop IP,pop CS,下面这段代码会造成死循环。
;一个死循环的例子
assume cs:codesg,ss:stack stack segment
db dup()
stack ends codesg segment mov bx,
push bx
;执行ret指令程序转到第一行开始执行
ret
mov ax,4c00h
int 21h start: mov ax,stack
mov ss,ax
mov sp,
mov ax,
push cs
push ax
;执行retf指令程序转到第一行开始执行
retf codesg ends
end start
end
call
call指令有多形式:call 标号;call far ptr 标号;call reg;call word tr 内存单元;call dword tr 内存单元.
1.call 标号
CPU执行call 标号相当于执行:
push IP
jmp near ptr 标号
ps:这里push IP是加上call 标号这条指令长度后的(IP)
2.call far ptr 标号
CPU执行call far ptr 标号相当于执行:
push CS
push IP jmp far ptr 标号
ps:先进行push CS操作我觉得是因为retf指令先进行pop IP操作,以完成子程序的功能
3.call reg
CPU执行call reg相当于执行:
push IP
jmp reg
ps:reg特指16位寄存器
4.call word ptr 内存单元
CPU执行call word ptr 内存单元相当于执行:
push IP
jmp word ptr 内存单元
5.call dword ptr 内存单元
CPU执行call dword ptr 内存单元相当于执行:
push CS
push IP
jmp dword ptr 内存单元
子程序
从ret和call的功能不难看出这两个指令是设计用来配合使用的,可以达到子程序的效果,和高级语言的函数很像,下面这段代码依然是死循环。
;一个死循环的例子
assume cs:codesg,ss:stack stack segment
db dup()
stack ends codesg segment start: mov ax,stack
mov ss,ax
mov sp,
call s
s: mov ax,offset s
push ax
ret
mov ax,4c00h
int 21h
codesg ends
end start
end
mul
mul是乘法指令,有两种情况:
1.8位乘法,两个相乘的数都是8位则一个数放在al中,另一个放在8位reg或内存单元中,结果存储在ax中
2.16位乘法,两个相乘的数都是16位则一个数放在ax中,另一个放在16位reg或内存字节单元中,结果高位存储在dx中,地位存储在ax中
到目前为止,加减乘除四种基本运算指令都已经学过了,下面写个小程序做次总结。
;基本的算数运算指令
assume cs:codesg codesg segment mov al,
add al,
mov cx,
s: add al,al
loop s
;al累加6次得结果128 mov bl,
mul bl
;8位数乘法,ax=0100h mov bx,1000d
mul bx
;16位乘法dx=0003h,ax=e800h div bx
;32除法,ax=0100h mov bl,
div bl
;16除法,al=128 sub al,al
;减法操作ax=0 codesg ends end
汇编学习笔记(7)call和ret指令的更多相关文章
- [汇编学习笔记][第十三章int指令]
第十三章int指令 13.1 int指令 格式: int n, n 为中断类型码 可以用int指令调用任何一个中断的中断处理程序(简称中断例程). 13.4 BIOS和DOS 所提供的中断例程 BIO ...
- 汇编学习笔记(11)int指令和端口
格式 int指令也是一种内中断指令,int指令的格式为int n,n是中断类型码.也就是说,使用int指令可以调用任意的中断例程,例如我们可以显示的调用0号中断例程,还记得在汇编学习笔记(10)中我们 ...
- [汇编学习笔记][第十章 CALL和RET指令]
第十章 CALL和RET指令 call和ret指令都是转移指令,它们都修改CS和IP.经常被共同用于实现子程序的设计.这一章,我们讲解call和ret指令的原理 10.1 ret和retf ret指令 ...
- 汇编学习笔记(3)[bx]和loop
本文是<汇编语言>一书的学习笔记,对应书中的4-6章. 汇编程序的执行 要想将源代码变为可执行的程序需经过编译.连接两个步骤,WIN7操作系统下需要MASM程序来进行编译连接工作.将MAS ...
- java web jsp学习笔记--概述-常用语法,指令,动作元素,隐式对象,域对象
JSP学习笔记 1.什么是jsp JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术.JSP/Servlet规范.JS ...
- 大数据学习笔记——Linux基本知识及指令(理论部分)
Linux学习笔记整理 上一篇博客中,我们详细地整理了如何从0部署一套Linux操作系统,那么这一篇就承接上篇文章,我们仔细地把Linux的一些基础知识以及常用指令(包括一小部分高级命令)做一个梳理, ...
- [汇编学习笔记][第五章[BX]和loop指令]
第五章[BX]和loop指令 前言 定义描述性符号“()”来表示一个寄存器或一个内存单元的内容,比如: (ax)表示ax中的内容,(al)表示al的内容. 约定符号ideta表示常量. 5.1 [BX ...
- 汇编学习笔记(AT&T语法)
一个最基本的汇编程序如下所示: .section .data .section .text .globl _start _start: movl $, %eax # the number 1 is t ...
- 汇编学习笔记——DOS及DEBUG介绍
转自:https://www.shiyanlou.com/courses/running/332 一.课程简介 声明:该课程基于<汇编语言(第2版)>郑晓薇 编著,机械工业出版社.本节实验 ...
随机推荐
- 9.26 noip模拟试题
魔术球问题弱化版(ball.c/.cpp/.pas) 题目描述 假设有 n 根柱子,现要按下述规则在这 n 根柱子中依次放入编号为 1,2,3,…的球. (1)每次只能在某根柱子的最上面放球. (2) ...
- Android studio混淆
看了一篇关于Android studio混淆的文章http://blog.csdn.net/qq_23547831/article/details/51581491,感觉有必要总结一个简单的混淆版本设 ...
- Android 巧妙实现图片和文字上下布局或者左右布局
最近去了一家新公司,然后开始做新的项目,看其代码发现了一个很巧妙的方法来实现图片在上面文字在下面的布局方式.只需要一个控件——RadioButton. 布局文件很简单,用来展示RadioBUtton的 ...
- 前端过滤XSS攻击
日常开发过程中,对于存在用户交互的一些门户网站等,过滤xss攻击是必不可少的. 此处主要记录下我在工作过程中的简单处理方法. 前端过滤XSS攻击, 我这里用的是开源工程 js-xss,官网地址:htt ...
- Sprite Kit教程:初学者
作者:Ray Wenderlich 原文出处:点击打开链接 http://www.raywenderlich.com/42699/spritekit-tutorial-for-beginners 转自 ...
- socket.io 实例
//引用 var io = require('socket.io')(server); //server io.on('connection', function(socket) { // ...
- HTML页面中启用360浏览器极速模式
今天做页面突然遇到浏览器一直在兼容模式下运行,体验不好,通过查询文档,在<head>中加入<meta name="renderer" content=" ...
- SGU 181.X-Sequence
时间限制:0.5s 空间限制:4M 题意: 令X0=A, Xi=(a*Xi-1^2,b*Xi-1+c)%m; 求Xk,(0<=k<=109),(0<=a,b<=100),(1& ...
- CSS的inherit与auto使用分析
一个很显浅的寓言,千年老树,电打雷劈,屹立不倒,却毁于蝼蚁的侵袭之下.自以为精通CSS的人,常常被一些小问题搞到头晕脑胀. 通常是一个很小的数值,经过层层放大歪曲后,整个布局就走形了.CSS是一门很简 ...
- 解决mac上Android开发时出现的ADB server didn't ACK
mac 上adb连接不到android手机可以参考:这里 xxxdeMacPro:~ xxx$ adb start-server * daemon not running. starting it n ...