汇编入门学习笔记 (九)—— call和ret
疯狂的暑假学习之 汇编入门学习笔记 (九)—— call和ret
參考: 《汇编语言》 王爽 第10章
call和ret都是转移指令。
1. ret和retf
ret指令:用栈中的数据,改动IP内容,从而实现近转移
相当于:
pop ip
retf指令:用栈中的数据。改动CS和IP,从而实现远转移
相当于:
pop ip
pop cs
样例:ret
assume cs:code,ss:stack stack segment
db 16 dup(1)
stack ends code segment
mov ax,4c00H
int 21H start: mov ax,stack
mov ss,ax
mov sp,16 mov ax,0
push ax
ret code ends end start
retf
assume cs:code,ss:stack stack segment
db 16 dup(1)
stack ends code segment
mov ax,4c00H
int 21H start: mov ax,stack
mov ss,ax
mov sp,16 mov ax,0
push cs
push ax retf code ends end start
2. call指令
call指令,运行操作:
1.将当前IP或CS和IP压入栈中
2.跳转
(1)根据位移进行转移的call指令
格式: call 标号
将下一条的指令的ip压入栈中。在转到标号处
相当于:
push ip
jmp near ptr 标号
(2)转移的目的地址在指令中的call指令
格式:
call far ptr 标号
将下一条的指令的CS和IP压入栈中。在转到标号处
相当于:
push cs
push ip
jmp far ptr
(3)转移地址地址在寄存器中的call指令
格式:call 16位reg
相当于:
push ip
jmp 16位reg
(4)转移地址在内存中的call指令
1. call word ptr 内存单元
相当于:
push ip
jmp word ptr 内存单元
2. call dword ptr 内存单元
相当于:
push cs
push ip
jmp dword ptr 内存单元
3. mul 指令
mul 是乘法指令
表示两个数相乘,它必须是都是8位或者都是16位
8位相乘 结果默认存放在ax中
16位相乘 结果高位存放在dx中。低位存放在ax中
样例见以下。
3. call和ret配合使用
call于ret结合使用。就相当于函数。
样例:求dw中数值的3次方。把bx当做“函数”參数,ax当做“函数”的返回值。
assume cs:code,ds:data data segment
dw 1,2,3,4,5,6,7,8
dd 0,0,0,0,0,0,0,0
data ends code segment
start: mov ax,data
mov ds,ax mov si,0
mov di,16
mov cx,8
s: mov bx,ds:[si]
call cube
mov ds:[di],ax
mov ds:[di+2],dx add si,2
add di,4
loop s mov ax,4c00H
int 21H cube: mov ax,bx
mul bx
mul bx
ret code ends end start
寄存器数量有限,假设要传的參数。或者返回的參数过多。
能够使用内存,或者栈。
样例:小写转大写。(用内存存放參数)
assume cs:code,ds:data data segment
db 'conversation'
data ends code segment
start: mov ax,data
mov ds,ax mov si,0
mov cx,12
call captial mov ax,4c00H
int 21H captial:and byte ptr ds:[si],11011111b
inc si
loop captial code ends end start
样例:计算 (a - b) ^3 如果a=3,b=1 (用栈来存放參数)
assume cs:code code segment
start: mov ax,1
push ax
mov ax,3
push ax
call difcube mov ax,4c00H
int 21H difcube:push bp
mov bp,sp
mov ax,[bp+4]
sub ax,[bp+6]
mov bp,ax
mul bp
mul bp
pop bp ret 4
code ends end start
上面代码中的 ret 4 表示:
pop ip
add sp,n
样例:小写转大写,用0结尾来推断。(用栈来处理寄存器冲突)
assume cs:code,ds:data data segment
db 'word',0
db 'city',0
db 'good',0
data ends code segment
start: mov ax,data
mov ds,ax
mov cx,3 mov bx,0
s: push cx
mov si,bx
call capital
add bx,5
pop cx
loop s mov ax,4c00H
int 21H capital:mov cl,[si]
mov ch,0
jcxz ok
and byte ptr [si],11011111b
inc si
jmp short capital
ok: ret
code ends end start
注意:要用栈保存cx
样例:实现show_str “函数” 在屏幕显示字符串。
用dh指定函数 。dl指定列号,cl指定颜色
assume cs:code,ds:data,ss:stack data segment
db 'Welcome to masm!',0
data ends stack segment
dw 8 dup(0)
stack ends code segment
start: mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16 mov dh,10 ;行
mov dl,17 ;列
mov cl,2 ;颜色
mov si,0
call show_str mov ax,4c00h
int 21h show_str: push ax
push di
push dx mov ax,10 ;确定行段 es
mul dh
add ax,0b800h
mov es,ax mov dh,0 ;确定列偏移 di,注意。一个字符两个字节
add dx,dx
mov di,dx s: push cx ;保存cx mov ch,0
mov cl,ds:[si]
jcxz ok ;假设为0 跳转 mov es:[di],cl
pop cx
mov es:[di+1],cl inc si
add di,2
jmp short s ok: pop cx ;不要忘记pop,眼不让rec还原的ip就不正确了
pop dx
pop di
pop ax
ret code ends end start
汇编入门学习笔记 (九)—— call和ret的更多相关文章
- 汇编入门学习笔记 (七)—— dp,div,dup
疯狂的暑假学习之 汇编入门学习笔记 (七)-- dp.div.dup 參考: <汇编语言> 王爽 第8章 1. bx.si.di.和 bp 8086CPU仅仅有4个寄存器能够用 &qu ...
- 汇编入门学习笔记 (十二)—— int指令、port
疯狂的暑假学习之 汇编入门学习笔记 (十二)-- int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...
- React 入门学习笔记整理目录
React 入门学习笔记整理(一)--搭建环境 React 入门学习笔记整理(二)-- JSX简介与语法 React 入门学习笔记整理(三)-- 组件 React 入门学习笔记整理(四)-- 事件 R ...
- Hadoop入门学习笔记---part4
紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...
- Hadoop入门学习笔记---part3
2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...
- PyQt4入门学习笔记(三)
# PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...
- PyQt4入门学习笔记(一)
PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...
- Hadoop入门学习笔记---part2
在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...
- Hadoop入门学习笔记---part1
随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...
随机推荐
- HDUOJ-----1098 Ignatius's puzzle
Ignatius's puzzle Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others ...
- 用 python 爬虫抓站的一些技巧总结
学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本,写过简单的验证码识别的脚本,本来想写goog ...
- 机器学习中的 ground truth
维基百科关于 ground truth的解释: [Ground truth] 大致为: 在统计学和机器学习中:在机器学习中ground truth表示有监督学习的训练集的分类准确性,用于证明或者推翻某 ...
- 面向对象程序设计(OOP设计模式)-结构型模式之装饰器模式的应用与实现
课程名称:程序设计方法学 实验4:OOP设计模式-结构型模式的应用与实现 时间:2015年11月18日星期三,第3.4节 地点:理1#208 一.实验目的 加深对结构型设计模式的理解以及在开发中的实际 ...
- jQuery瀑布流无限拖三大利器:masonry+imagesloaded+infinitescroll
瀑布流已经是几乎过时的技术了,不过对于很多想要快速实现它的朋友而言,却绝非易事,因为即使我们已经有很多现成的代码,却发现在自己的开发环境中无法快速得到自己想要的结果.就像我们现在要介绍的三大利器(ma ...
- surging+CentOS7+docker+rancher2.0 菜鸟部署运行笔记
https://blog.csdn.net/q5934/article/details/82661250 目录 准备工作 开始干活 1.从github 获取surging源码 2.发布Surging. ...
- OAF_OAF OAWebBean和OAPageContext的分析(概念)
2015-04-03 Created By BaoXinjian
- java使用ssh访问Linux的项目jscraft
一.gradle地址 // https://mvnrepository.com/artifact/com.jcraft/jsch compile group: 'com.jcraft', name: ...
- spring boot 整合 redis
自己开发环境需要安装 redis 服务,百度一下很多,下面主要说明Springboot 集成 redis 讲解 我的版本 java8 + redis3.0 + springboot 1.5.9. Sp ...
- unity5 创建material
在material文件夹下 unity5中新创建的material默认如下 开始我不知道贴图应该加在哪儿.于是跳过教程上这一步,直接去选shader: 在这个shader下很明显看到加贴图的地方了: ...