疯狂的暑假学习之  汇编入门学习笔记 (九)——  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. HDUOJ-----1098 Ignatius's puzzle

    Ignatius's puzzle Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others ...

  2. 用 python 爬虫抓站的一些技巧总结

    学用python也有3个多月了,用得最多的还是各类爬虫脚本:写过抓代理本机验证的脚本,写过在discuz论坛中自动登录自动发贴的脚本,写过自动收邮件的脚本,写过简单的验证码识别的脚本,本来想写goog ...

  3. 机器学习中的 ground truth

    维基百科关于 ground truth的解释: [Ground truth] 大致为: 在统计学和机器学习中:在机器学习中ground truth表示有监督学习的训练集的分类准确性,用于证明或者推翻某 ...

  4. 面向对象程序设计(OOP设计模式)-结构型模式之装饰器模式的应用与实现

    课程名称:程序设计方法学 实验4:OOP设计模式-结构型模式的应用与实现 时间:2015年11月18日星期三,第3.4节 地点:理1#208 一.实验目的 加深对结构型设计模式的理解以及在开发中的实际 ...

  5. jQuery瀑布流无限拖三大利器:masonry+imagesloaded+infinitescroll

    瀑布流已经是几乎过时的技术了,不过对于很多想要快速实现它的朋友而言,却绝非易事,因为即使我们已经有很多现成的代码,却发现在自己的开发环境中无法快速得到自己想要的结果.就像我们现在要介绍的三大利器(ma ...

  6. surging+CentOS7+docker+rancher2.0 菜鸟部署运行笔记

    https://blog.csdn.net/q5934/article/details/82661250 目录 准备工作 开始干活 1.从github 获取surging源码 2.发布Surging. ...

  7. OAF_OAF OAWebBean和OAPageContext的分析(概念)

    2015-04-03 Created By BaoXinjian

  8. java使用ssh访问Linux的项目jscraft

    一.gradle地址 // https://mvnrepository.com/artifact/com.jcraft/jsch compile group: 'com.jcraft', name: ...

  9. spring boot 整合 redis

    自己开发环境需要安装 redis 服务,百度一下很多,下面主要说明Springboot 集成 redis 讲解 我的版本 java8 + redis3.0 + springboot 1.5.9. Sp ...

  10. unity5 创建material

    在material文件夹下 unity5中新创建的material默认如下 开始我不知道贴图应该加在哪儿.于是跳过教程上这一步,直接去选shader: 在这个shader下很明显看到加贴图的地方了: ...