疯狂的暑假学习之  汇编入门学习笔记 (九)——  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. Start-Sleep 帮助信息

    如下说明是翻译: help Start-Sleep 产生的帮助信息.译者: Edengundam(马涛) Start-Sleep 大纲使shell, 脚本, 或运行空间的活动挂起指定的时间. 语法St ...

  2. 初学者的React全家桶完整实例

    概述 该项目还有些功能在开发过程中,如果您有什么需求,欢迎您与我联系.我希望能够通过这个项目对React初学者,或者Babel/webpack初学者都有一定的帮助.我在此再强调一下,在我写的这些文章末 ...

  3. 封装UIlabel 辨别用户名 ,话题 ,链接,电话,高亮文字等

    概述 对UIlabel进行封装 用于辨别用户名 ,话题 ,链接,电话,高亮文字等,链接跳转网页,电话点击拨打电话,完美封装UIlabel,适合绝大多数需求 详细 代码下载:http://www.dem ...

  4. android.webkit.WebView/WebViewClient/WebChromeClient

    使用android.webkit.WebView控件 在xml布局文件中定义 <WebView   android:id="@+id/webkit01"   android: ...

  5. Java compiler level does not match解决方法(转)

    本文转自:https://www.cnblogs.com/lauer0246/p/5740572.html#undefined 从别的地方导入一个项目的时候,经常会遇到eclipse/Myeclips ...

  6. 安装Python 3.6

    原文地址:https://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143160904 ...

  7. Fix-Mapped Addresses

    一.前言 某天,wowo同学突然来了一句:如果要在start_kernel中点LED,ioremap在什么时间点才能调用呢?我想他应该是想通过点LED灯来调试start_kernel之后的初始化的代码 ...

  8. stm32 外扩SRAM使用问题

    当把外扩SRAM内存拷贝到片上SRAM内存时使用内存拷贝函数memset()或者原子定义的mymemset()函数,编译器会提示空间不足. 原因是这两个函数一个是只能对片上SRAM操作,一个是只能对外 ...

  9. oracle排序使用,很多中函数,不同的效果

    参考原文:http://blog.csdn.net/wanglipo/article/details/6954915 row_number() OVER (PARTITION BY COL1 ORDE ...

  10. 不能与abstruct共同修饰方法的关键字

    一 抽象类:动态方法至少有一个是抽象方法. 其中abstruct关键字修饰的方法不能与哪些关键字共同修饰? 1private 因为private修饰的方法在子类中是隐藏的.不可见的.而abstruct ...