王爽 《汇编语言》第10章 CALL和RET指令 学习笔记

目录

一、ret和retf

二、call指令

(一)操作:

(二)几种转移方法

1.标号法

(1)近转移(段内)

(2)远转移(段间)

2.寄存器法

3.内存法

(1)近转移(段内)

(2)远转移(段间)

三、call和ret的配合使用

四、mul指令

五、参数和结果传递的问题

1.单个数据的传递

2.批量数据的传递


一、ret和retf

ret 相当于pop IP

retf 相当于pop IP     pop CS

二、call指令

(一)操作:

(1)push IP

        push CS

(2)转移

call指令不能实现短转移,除此之外,call实现转移的方法和jmp相同

(二)几种转移方法

1.标号法

(1)近转移(段内)

语法:call 标号

操作:

push IP

jmp near ptr 标号

(2)远转移(段间)

语法:call far ptr 标号

操作:

push CS

push IP

jmp far ptr 标号

2.寄存器法

语法:call 16位reg

操作:

push IP

jmp 16位reg

3.内存法

(1)近转移(段内)

语法:call word ptr 内存单元地址

操作:

push IP

jmp word ptr 内存单元地址

(2)远转移(段间)

语法:call dword ptr 内存单元地址

操作:

push IP

jmp dword ptr 内存单元地址

三、call和ret的配合使用

call是跳转到指定的程序,而ret是回到call,继续执行call下方语句

因此,可以用call和ret来实现子程序的机制。

子程序的框架如下:

assume cs:code
code segment
    main:
        ...     
        call sub1
        ...
        mov ax,4c00h
        int 21h

    sub1:
        ...
        call sub2
        ...
        ret

    sub2:
        ...
        ret

code ends
end main

四、mul指令

注意事项:

(1)两个相乘的数,要么都是8位,要么都是16位。

如果都是8位,一个默认在AL中,另一个放在8位reg或内存字节单元中

如果都是16位,一个默认在AX中,另一个放在16位reg或内存字单元中。

(2)结果

如果是8位乘法,结果默认放在AX中

如果是16位惩罚,结果高位默认放在DX中存放,低位在AX中存放

语法:

mul reg

mul 内存单元

例:计算100*10

mov al,100
mov bl,10
mul bl

结果:(ax)=1000(03E8H)

五、参数和结果传递的问题

1.单个数据的传递

子程序一般需要根据提供的参数处理一定的事务,处理后,将结果提供给调用者。

故需要存储参数和返回值。

例:参数为N,返回N的3次方

可以将参数存储在bx中,将结果放在dx和ax中

cube:   mov ax,bx
        mul bx
        mul bx
        ret

2.批量数据的传递

可以将批量数据放在内存中,然后将首地址放在寄存器中,传递给需要的子程序。

例:将一个全是字母的字符串转化为大写

assume cs:code

data segment
    db 'conversation'
data ends

code segment
    start:  mov ax,data
            mov ds,ax
            mov si,0
            mov cx,12
            call capital
            mov ax,4c00h
            int 21h

   capital: and byte ptr [si],11011111b
            inc si
            loop capital
            ret

code ends
end start

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

云霄星乖乖的果冻

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值