汇编入门学习笔记 (九)—— 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
随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...
随机推荐
- 插入UUID,出现Data truncation: Data too long for column 'id' at row 1
ssc.udf.register("getuuid", () => UUID.randomUUID().toString) val stuPCountDF_tmp1=ssc. ...
- C#多线程之 ManualResetEvent和AutoResetEvent
初次体验 ManualResetEvent和AutoResetEvent主要负责多线程编程中的线程同步:以下一段是引述网上和MSDN的解析: 在.Net多线程编程中,AutoResetEvent和Ma ...
- 掀开图片显示介绍的css效果
概述 主要运用到CSS3的3D transform等变换 详细 代码下载:http://www.demodashi.com/demo/10575.html 一.概述 1.主要运用到CSS3的3D tr ...
- Git恢复之前版本的两种方法reset、revert(图文详解)
一.问题描述在利用github实现多人合作程序开发的过程中,我们有时会出现错误提交的情况,此时我们希望能撤销提交操作,让程序回到提交前的样子,本文总结了两种解决方法:回退(reset).反做(reve ...
- linux命令中的 < 和 |、>符号作用就解释
输出重定向比如输入一条命令,默认行为是将结果输出到屏幕.但有时候我们需要将输出的结果保存到文件,就可以用重定向.ps > ps.txt < 表示的是输入重定向的意思,就是把<后面跟的 ...
- 为同一部电脑设置2个IP地址
为同一部电脑设置2个IP地址 在HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\Class\NetTrans下 点击0000.0001,000 ...
- JMeter学习笔记--JMeter常用测试元件
JMeter测试计划有一个被称为“函数测试模式”的选项,如果被选择,它会使Jmeter记录来自服务器返回的每个取样的数据.如果你在测试监听器中选择一个文件,这个数据将被写入文件.如果你尝试一个较小的测 ...
- Android: ListView数据的分批加载 以及 Handle 总结
这是效果图: activity_main.xml 01 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/ ...
- Linux中断 - softirq
一.前言 对于中断处理而言,linux将其分成了两个部分,一个叫做中断handler(top half),是全程关闭中断的,另外一部分是deferable task(bottom half),属于不那 ...
- Python多线程之线程创建和终止
python主要是通过thread和threading这两个模块来实现多线程支持. python的thread模块是比較底层的模块,python的threading模块是对thread做了一些封装,能 ...