疯狂的暑假学习之  汇编入门学习笔记 (九)——  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的更多相关文章

  1. 汇编入门学习笔记 (七)—— dp,div,dup

    疯狂的暑假学习之  汇编入门学习笔记 (七)--  dp.div.dup 參考: <汇编语言> 王爽 第8章 1. bx.si.di.和 bp 8086CPU仅仅有4个寄存器能够用 &qu ...

  2. 汇编入门学习笔记 (十二)—— int指令、port

    疯狂的暑假学习之  汇编入门学习笔记 (十二)--  int指令.port 參考: <汇编语言> 王爽 第13.14章 一.int指令 1. int指令引发的中断 int n指令,相当于引 ...

  3. React 入门学习笔记整理目录

    React 入门学习笔记整理(一)--搭建环境 React 入门学习笔记整理(二)-- JSX简介与语法 React 入门学习笔记整理(三)-- 组件 React 入门学习笔记整理(四)-- 事件 R ...

  4. Hadoop入门学习笔记---part4

    紧接着<Hadoop入门学习笔记---part3>中的继续了解如何用java在程序中操作HDFS. 众所周知,对文件的操作无非是创建,查看,下载,删除.下面我们就开始应用java程序进行操 ...

  5. Hadoop入门学习笔记---part3

    2015年元旦,好好学习,天天向上.良好的开端是成功的一半,任何学习都不能中断,只有坚持才会出结果.继续学习Hadoop.冰冻三尺,非一日之寒! 经过Hadoop的伪分布集群环境的搭建,基本对Hado ...

  6. PyQt4入门学习笔记(三)

    # PyQt4入门学习笔记(三) PyQt4内的布局 布局方式是我们控制我们的GUI页面内各个控件的排放位置的.我们可以通过两种基本方式来控制: 1.绝对位置 2.layout类 绝对位置 这种方式要 ...

  7. PyQt4入门学习笔记(一)

    PyQt4入门学习笔记(一) 一直没有找到什么好的pyqt4的教程,偶然在google上搜到一篇不错的入门文档,翻译过来,留以后再复习. 原始链接如下: http://zetcode.com/gui/ ...

  8. Hadoop入门学习笔记---part2

    在<Hadoop入门学习笔记---part1>中感觉自己虽然总结的比较详细,但是始终感觉有点凌乱.不够系统化,不够简洁.经过自己的推敲和总结,现在在此处概括性的总结一下,认为在准备搭建ha ...

  9. Hadoop入门学习笔记---part1

    随着毕业设计的进行,大学四年正式进入尾声.任你玩四年的大学的最后一次作业最后在激烈的选题中尘埃落定.无论选择了怎样的选题,无论最后的结果是怎样的,对于大学里面的这最后一份作业,也希望自己能够尽心尽力, ...

随机推荐

  1. 掀开图片显示介绍的css效果

    概述 主要运用到CSS3的3D transform等变换 详细 代码下载:http://www.demodashi.com/demo/10575.html 一.概述 1.主要运用到CSS3的3D tr ...

  2. 原创:微信小程序页面跳转展示缓冲提示

    1.在JS文件中,直接加上下面代码即可: //缓冲提醒 wx.showToast({ title: '加载中', icon: 'loading', duration: 400 })

  3. mysql中char,varchar,text

    1.char char最大长度是255字符,注意是字符数和字符集没关系. 1)可以有默认值, 2)尾部有空格会被截断 3)不管汉字.英文,还是其他编码,都可以存255字符 2.varchar 1)va ...

  4. 用Visual Studio 2010开发Android应用

    在开发你的第一个Android应用程序之前,你应该先检查一下是否安装了Android SDK,以及是否创建好了Android模拟器(AVD),如果有不清楚的地方,请先看我以前发布的这篇文章“Andro ...

  5. JQuery 导入导出 Excel

    正在做一个小项目, 从数据库中查询数据放在 HTML Table 中. 现在想要从这个 table 中导出数据来. 另外用户需要选择导出的列. 使用 jQuery 的导出插件可以完成这个需求. jQu ...

  6. 学习WCF笔记之二

    一.学习文章http://www.cnblogs.com/iamlilinfeng/archive/2012/09/25/2700049.html 二.步骤 学习WFC,按照大神的文章一步步学习,不过 ...

  7. linux内存回收机制

    无论计算机上有多少内存都是不够的,因而linux kernel需要回收一些很少使用的内存页面来保证系统持续有内存使用.页面回收的方式有页回写.页交换和页丢弃三种方式:如果一个很少使用的页的后备存储器是 ...

  8. InnoDB Master Thread I/O Rate详解

    一.innodb 在刷盘时要面对的问题: 1.对于innodb 的master thread 这个线程来说,它会在后台执行许多的任务,这些任务大多数都是与IO操作相关的, 比如“刷新脏页到磁盘”.“合 ...

  9. C 字符串常量和字符串变量定义和区别

    字符串常量 定义:在一个双引号""内的字符序列或者转义字符序列称为字符串常量 例如:"HA HA!"  "abc"  "\n\t& ...

  10. Java:多线程,线程同步,同步锁(Lock)的使用(ReentrantLock、ReentrantReadWriteLock)

    关于线程的同步,可以使用synchronized关键字,或者是使用JDK 5中提供的java.util.concurrent.lock包中的Lock对象.本文探讨Lock对象. synchronize ...