10.《汇编语言》-王爽第三版学习笔记 CALL 和 RET指令

1. RET && RETF 指令

  • CPU 执行 ret 指令时,进行下面两部操作:
    (1)(IP) = ((SS)*16+(SP))
    (2)(SP)=(SP)+2

  • CPU 执行 retf 指令时,进行下面两部操作:
    (1)(IP) = ((SS)16+(SP))
    (2)(SP)=(SP)+2
    (3)(CS) = ((SS)
    16+(SP))
    (4)(SP)=(SP)+2k

  • 可以看出,如果用汇编语法来解释 ret,retf 指令,则:
    CPU 执行 ret 指令时,相当于:
    pop IP
    CPU 执行 retf 指令时,相当于:
    pop IP
    pop CS

2. CALL 指令

  • CPU 执行 call 指令时,进行下面两部操作:
    (1) 将当前的 IP 或 CS 和 IP 压入 栈中;
    (2) 转移;

  • call指令不能实现短转移,call指令实现转移的方法和jmp指令的原理相同。

2. 依据位移进行转移的 CALL 指令

  • call 标号(将当前的 IP 压栈后,转移到标号处执行指令。)
    CPU 执行此种格式的 call 指令后,会进行如下的操作:
    (1)(SP)=(SP)-2
    ((SS)*16+(SP))=(IP)
    (2)(IP) = (IP) + 16位位移
    相当于:
    push IP
    jmp near ptr 标号

3. 转移的目的地址在指令中的 CALL 指令

call far ptr 标号 实现的是段间转移
CPU 执行此种格式的 call 指令后,会进行如下的操作:
(1)(SP)=(SP)-2
((SS)16+(SP))=(CS)
(SP)=(SP)-2
((SS)
16+(SP))=(IP)
(2)(CS) = 标号所在段的段地址
(IP)= 标号所在段中的偏移地址
相当于:
push CS
push IP
jmp far ptr 标号

4. 位移地址寄存器中的 CALL 指令

call 16位reg
CPU 执行此种格式的 call 指令后,会进行如下的操作:
(1)(SP)=(SP)-2
((SS)*16+(SP))=(IP)
(IP)= (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 内存单元地址

5. 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

5. mul 指令

  • 格式如下:
    mul reg
    mul 内存单元
  • 注意点:
    (1)两个相乘的数:
    两个相乘的数,要么都是8位,要么都是16位。
    如果是8位,一个默认存放在 AL 中,另一个存放在 8 位reg 或者 内存字节单位中;
    如果是16位,一个默认存放在 AX 中,另一个存放在 16 位reg 或者 内存字单位中;
    (2)结果:
    如果是8位乘法,结果默认存放在 AX 中;
    如果是16位乘法,结果高位默认在DX中存放, 地位在AX中存放。

6. 参数和结果传递

assume cs:codesg,ds:datasg

datasg segment
    dw 1,2,3,4,5,6,7,8
    dd 0,0,0,0,0,0,0,0
datasg ends

codesg segment

  start: mov ax,datasg
         mov ds,ax
         mov si,0
         mov di,10h

         mov cx,8
      s: mov bx,[si]
         call cube
         mov [di],ax
         mov [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

codesg ends

end start

6. 批量数据的传递

assume cs:codesg,ds:datasg

datasg segment
    db 'conversation'
datasg ends

codesg segment
    start: mov ax,datasg
           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
codesg ends

end start

6. 用栈传递参数

assume cs:codesg,ss:stacksg

stacksg segment
    dw 8 dup (0)
stacksg ends

codesg segment

    start: mov ax,stacksg
           mov ss,ax
           mov sp,10h

           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

codesg ends

end start

7. 寄存器冲突问题

assume cs:codesg,ds:datasg

datasg segment
  db 'word',0
  db 'unix',0
  db 'wind',0
  db 'good',0
datasg ends

codesg segment

    start: mov ax,datasg
           mov ds,ax
           mov bx,0

           mov cx,4
        s: mov si,bx
           call capital
           add bx,5
           loop s

           mov ax,4c00h
           int 21h

  capital: push cx
           push si

   change: mov cl,[si]
           mov ch,0
           jcxz ok
           and byte ptr [si],11011111b
           inc si
           jmp short change

       ok: pop si
           pop cx
           ret

codesg ends

end start

8. 显式字符串

在第8行的第三列,用绿色显式 data 段中的字符串:

assume cs:codesg,ds:datasg

datasg segment
  db 'welcome to masm!',0
datasg ends

codesg segment

    start: mov dh,8
           mov dl,3
           mov cl,2

           mov ax,datasg
           mov ds,ax
           mov si,0

           call show_str

           mov ax,4c00h
           int 21h

 show_str: push cx
           push si
           push di
           push bx

           mov ax,0B800H
           mov es,ax

           mov di,0

           mov al,160
           mul dh
           mov bx,ax

           mov al,2
           mul dl
           add ax,bx
           
           mov bx,ax

           mov ah,cl

    show:  mov cl,ds:[si]
           mov ch,0
           jcxz ok
           
           mov al,ds:[si]
           mov es:[bx+di],al
           mov es:[bx+di+1],ah
           
           inc si
           add di,2
           jmp short show


       ok: pop bx
           pop di
           pop si
           pop cx
           ret

codesg ends

end start

8. 进行不会产生溢出的出发运算

assume cs:codesg

codesg segment

    start: mov ax,4240H
           mov dx,000FH
           mov cx,0AH
           call divdw

           mov ax,4c00h
           int 21h


    divdw: push bx
           
           mov bx,ax
           mov ax,dx
           mov dx,0000H
           div cx

           push ax
           mov ax,bx
           div cx

           mov cx,dx
           pop dx

           pop bx
           ret


codesg ends

end start
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 206,602评论 6 481
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 88,442评论 2 382
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 152,878评论 0 344
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 55,306评论 1 279
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 64,330评论 5 373
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,071评论 1 285
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,382评论 3 400
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,006评论 0 259
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 43,512评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,965评论 2 325
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,094评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,732评论 4 323
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,283评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,286评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,512评论 1 262
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,536评论 2 354
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,828评论 2 345

推荐阅读更多精彩内容

  • 一、基础知识 mov ax,bx把BX内容送到AX中。汇编语言有3类指令,汇编指令、伪指令,其他符号。CPU通过地...
    赤果_b4a7阅读 1,836评论 0 1
  • 版权声明:本文为 gfson 原创文章,转载请注明出处。注:作者水平有限,文中如有不恰当之处,请予以指正,万分感谢...
    gfson阅读 2,191评论 0 1
  • 1.call和ret指令都是转移指令,它们都修改IP的值,或同时修改CS和IP的值。它们经常共同用语实现子程序的设...
    nalis风阅读 5,576评论 0 0
  • CPU中: 运算器进行信息处理 寄存器进行信息存储 控制器控制各种器件进行工作 内部总线连接各种器件,在它们之间进...
    Nonmfly阅读 223评论 0 0
  • 推荐指数: 6.0 书籍主旨关键词:特权、焦点、注意力、语言联想、情景联想 观点: 1.统计学现在叫数据分析,社会...
    Jenaral阅读 5,701评论 0 5