首页 > 编程语言 >汇编语言:call、call far ptr、call word ptr、call dword ptr、call 寄存器

汇编语言:call、call far ptr、call word ptr、call dword ptr、call 寄存器

时间:2024-08-17 23:53:10浏览次数:13  
标签:word 16 IP sp 指令 call ax ptr

引言

        call指令是转移指令,CPU执行call指令,进行两步操作:

(1)将当前IP或当前CS和IP压入栈中
(2)转移。call指令不能短转移,除此之外,call指令转移的方法跟jmp指令的原理相同。

1. call 标号

        call 标号 是根据位移进行进转移的call指令,实现的是段内转移,指令功能:将当前IP压入栈中,然后转移到标号处执行指令。其对寄存器操作的原理如下:

(1)(sp) = (sp) - 2                       ;栈顶开辟2个字节的空间
         ((ss)*16+(sp)) = (IP)             ;栈顶的值 = (IP)
(2)(IP) = (IP) + 16位位移           ;修改IP值

tips:

16位位移 = 标号处的地址 - call指令后的下一条指令的首地址
16位位移用补码的形式表示,范围在 -32768 ~ 32767
16位位移由编译器编译时算出

所以,CPU执行call 标号指令时,相当于执行:

(1)push IP
(2)jmp near ptr 标号

assume cs:code, ss:stack
stack segment
    db 16 dup (0)
stack ends
code segment
start:
    mov ax, 0
    call s      ;执行该指令的内部逻辑步骤:(1) pop IP(即指向inc ax指令的首地址); 
                ;                       (2)IP = IP + (s标号处指令的首地址 - call s指令的下一条指令(即 inc ax指令)的首地址)
    inc ax
s: 
    pop ax

    mov ax, 4c00h
    int 21h
code ends
end start

从以上运行结果分析

(1)16位位移 = s标号处指令的首地址 - call s指令的下一条指令的首地址 = 0007h - 0006h = 0001h
(2)call s,编译成 call 0007,对应的机器码:E80100(低字节序),其中最低位:E8是操作码,0001是16位位移
(3)执行 call s 指令,IP = 0006h压入栈,然后 IP = IP + (0007h - 0006h) = 0006h + 0001h = 0007h
(4)程序转移到s标号处,即pop ax 处执行,得到:ax = 0006h

2. call far ptr 标号

        call far ptr 标号 是转移的目的地址在指令中的call指令,实现的是段间转移,指令功能:将当前CS压入栈中,然后再将当前IP压入栈中,最后转移到标号处执行指令。其对寄存器操作的原理如下:

(1)(sp) = (sp) - 2                       ;栈顶开辟2个字节的空间
         ((ss)*16+(sp)) = (CS)            ;当前栈顶的值 = (CS)
         (sp) = (sp) - 2                       ;栈顶再开辟2个字节的空间
         ((ss)*16+(sp)) = (IP)             ;当前栈顶的值 = (IP)
(2)(CS) = 标号所在段的段地址
         (IP) = 标号在段中的偏移地址

所以,CPU执行call far ptr 标号指令时,相当于执行:

(1)push CS
         push IP
(2)jmp far ptr 标号

assume cs:code, ss:stack
stack segment
    db 16 dup (0)
stack ends
code segment
start:
    ;初始化栈
    mov ax, stack       ;ax = 204D
    mov ss, ax          ;初始化栈:设置栈段地址ss = 204D
    mov sp, 16          ;设置栈顶地址sp = 16

    mov ax, 0
    call far ptr s      ;(1)push CS (2)push IP (3)CPU转移到标号S处执行指令
    inc ax
s:
    pop ax              ;IP的值出栈
    add ax, ax
    pop bx              ;CS的值出栈
    add ax, bx          
    mov ax, 4c00h
    int 21h
code ends
end start

(1)程序分析

        程序包括16个字节的栈段(stack segment ... stack end)和代码段 (code segment ... code ends) 。end start 指明程序开始执行时,从代码段的 start 标号处开始执行,start标号在代码段中的首地址处,所以 IP = 0000h

(2)代码执行过程分析:

a) 调试程序(父进程)把我们的程序(子进程)加载进内存,并设置CS:IP = 204E:0000,CPU开始执行我们的指令代码。

b) mov ax, stack       ;ax = 204Dh
    mov ss, ax            ;初始化栈:设置栈段地址ss = 204Dh
    mov sp, 16           ;设置栈顶地址sp = 16

c) mov ax, 0             ; ax = 0h
    call far ptr s          ; (1)push CS (2) push IP (3)CPU转移到标号S处执行指令
    inc ax

d) s:
    pop ax              ;IP的值出栈,ax = 0010h
    add ax, ax        ; ax = 0020h
    pop bx              ;CS的值出栈,bx = 204Eh
    add ax, bx        ; ax = ax + bx = 0020h + 204Eh = 206Eh       

3. call 16位寄存器

        call 16位寄存器 是转移的目的地址在寄存器中的call指令,实现的是段内转移,指令功能:将当前IP压入栈中,然后转移到寄存器中指明的目的地址处执行指令。其对寄存器操作的原理如下:

(1)(sp) = (sp) - 2                       ;栈顶开辟2个字节的空间
         ((ss)*16+(sp)) = (IP)             ;栈顶的值 = (IP)
(2)(IP) = (16位寄存器)               ;修改IP值

CPU执行call 16位寄存器指令时,相当于执行:

(1)push IP
(2)jmp 16位寄存器

assume cs:code, ss:stack
stack segment
    db 16 dup (0)
stack ends
code segment
start:
    ;初始化栈
    mov ax, stack
    mov ss, ax
    mov sp, 16

    mov ax, 14
    call ax         ;(1)push IP (2)CPU转到 (ax寄存器) 处执行指令
    inc ax
    mov bp, sp
    add ax, [bp]

    mov ax, 4c00h
    int 21h
code ends
end start

(1)程序分析

        程序包括16个字节的栈段(stack segment ... stack end)和代码段 (code segment ... code ends) 。end start 指明程序开始执行时,从代码段的 start 标号处开始执行,start标号在代码段中的首地址处,所以 IP = 0000h

(2)代码执行过程分析:

a) 调试程序(父进程)把我们的程序(子进程)加载进内存,并设置CS:IP = 204E:0000,CPU开始执行我们的指令代码。

b) mov ax, stack       ;ax = 204Dh
    mov ss, ax            ;初始化栈:设置栈段地址ss = 204Dh
    mov sp, 16           ;设置栈顶地址sp = 16

c) mov ax, 14           ; ax = 000Eh
    call ax                  ; (1)push IP (2)CPU转到 (ax寄存器) 处执行指令
    inc ax

d) mov bp, sp           ; bp = sp = 000Eh
    add ax, [bp]          ; ax = ax + ss:[bp] = 000Eh + 000Dh = 001Bh

4. call word ptr 内存单元地址

        call word ptr 内存单元地址 是转移的目的地址在内存中的call指令,实现的是段内转移,指令功能:将当前IP压入栈中,然后转移到内存中指明的目的地址处执行指令。其对寄存器操作的原理如下:

(1)(sp) = (sp) - 2                       ;栈顶开辟2个字节的空间
         ((ss)*16+(sp)) = (IP)             ;栈顶的值 = (IP)
(2)(IP) = (内存单元地址)           ;修改IP值

CPU执行 call word ptr 内存单元地址 指令时,相当于执行:

(1)push IP
(2)jmp word ptr 内存单元地址

例如,下面的指令

mov sp = 16
mov ax = 0008h
mov ds:[0], ax
call word ptr ds:[0]

执行后,(IP) = 0008h, (sp) = 000Eh

5. call dword ptr 内存单元地址

        call dword ptr 内存单元地址 是转移的目的地址在内存中的call指令,实现的是段间转移,指令功能:将当前CS压入栈中,然后再将当前IP压入栈中,最后转移到内存中指明的目的地址处执行指令,在指明的内存单元地址中,高字(2字节)内存中存放的是目的段地址(CS),低字(2字节)内存中存放的是目的偏移地址(IP)。其对寄存器操作的原理如下:

(1)(sp) = (sp) - 2                       ;栈顶开辟2个字节的空间
         ((ss)*16+(sp)) = (CS)            ;当前栈顶的值 = (CS)
         (sp) = (sp) - 2                       ;栈顶再开辟2个字节的空间
         ((ss)*16+(sp)) = (IP)             ;当前栈顶的值 = (IP)
(2)(CS) = 内存单元地址[2]
         (IP) = 内存单元地址[0]

所以,CPU执行call dword ptr 内存单元地址指令时,相当于执行:

(1)push CS
         push IP
(2)jmp dword ptr 内存单元地址

例如,下面的指令

mov sp, 16
mov word ptr ds:[0], 0
mov ax, 204Eh
mov ds:[2], ax
call dword ptr ds:[0]

执行后,(CS) = 204Eh, (IP) = 0000h, (sp) = 000Ch

参考文献

《汇编语言(第4版)》王爽

标签:word,16,IP,sp,指令,call,ax,ptr
From: https://blog.csdn.net/d704791892/article/details/141264623

相关文章

  • asp.net core 调用wps实现word转pdf
    安装wpshttps://www.wps.cn/创建.netcore控制项目添加com引用,搜索wps准备word,名字叫001.docxword转pdf编写代码namespaceWPSStu01{internalclassProgram{staticvoidMain(string[]args){Console.WriteLine("......
  • pdf转word免费的软件
    该版本属于免费便携版,可以免费将pdf转成word。软件截图:使用说明:解压后,双击start_Foxit.bat来运行软件下载地址:FoxitPDFEditor-Pro-v13解压密码:helloh下载时可能会有广告,忽略,等下载结束即可。部分杀软会因该版本软件未购买签名证书(如下图)而阻止运行,可通过暂时关闭杀软......
  • 批量Word文档合并助手-V1.4.6.21
    在日常办公与文档处理中,经常需要面对大量分散的Word文档,手动一个个打开、复制、粘贴以合并内容,不仅耗时费力,还极易出错。为此,我们特别推出了“批量Word文档合并助手”软件,旨在为您提供一个高效、便捷的解决方案,让文档合并变得轻松简单。核心功能:一键合并:支持批量选择多个Word......
  • LookupError: Resource averaged_perceptron_tagger not found.解决方案
      大家好,我是爱编程的喵喵。双985硕士毕业,现担任全栈工程师一职,热衷于将数据思维应用到工作与生活中。从事机器学习以及相关的前后端开发工作。曾在阿里云、科大讯飞、CCF等比赛获得多次Top名次。现为CSDN博客专家、人工智能领域优质创作者。喜欢通过博客创作的方式对所学......
  • Word文件加密的三种专业方法
    Word文档承载着大量敏感信息,如公司机密、合同内容及个人重要资料等。为了确保这些信息的安全性,对Word文件进行加密处理成为了必要的手段。本文将详细介绍三种Word文件加密方法,帮助大家根据实际需求选择合适的加密方式。首先我们要知道,word文档中主要分为打开密码、限制编辑、......
  • 【Python-办公自动化】1秒提取PPT文本内容形成目录保存至WORD
    欢迎来到"花花ShowPython",一名热爱编程和分享知识的技术博主。在这里,我将与您一同探索Python的奥秘,分享编程技巧、项目实践和学习心得。无论您是编程新手还是资深开发者,都能在这里找到有价值的信息和灵感。自我介绍:我热衷于将复杂的技术概念以简单易懂的方式呈现给大家,......
  • 【Java】Word题库解析
    一、需求场景:一共四种题型,单选、多选、判断、简答题目构成要素:题目、选项、答案、解析一种题型一个Word文档存放,需要把这些题目写入DB维护 二、题库格式:单选案例:多选案例: 判断案例:简答题案例:可以看出,单选,多选和判断都是一样的- 题目有数字和点开头,并设置了标题......
  • coca how word clusters页面
           Collocates     Clusters   Topics   Texts   KWIC       45624how do36622how you28435how it25414how can24930how they24357how did24206how long22277how about21728how ......
  • word转化为markdown格式
    要将Word文档转换为Markdown格式,‌有几种方法可以实现这一转换,‌包括使用命令行工具、‌专门的转换工具以及通过编程方式。‌使用命令行工具:‌Pandoc是一个强大的文档转换工具,‌支持多种格式之间的转换,‌包括Word文档(‌docx)‌到Markdown的转换。‌你可以从GitHub下载......
  • TypeError: add_code_sample_docstrings() got an unexpected keyword argument ‘tok
    可能是transformers的版本太高,可以考虑降版本。更推荐的解决方案:processor_class替换tokenizer_class注意:需要CTRLShiftF tokenizer_class,全部替换掉。参考链接:ALBEF(AlignbeforeFuse:VisionandLanguageRepresentationLearningwithMomentumDistillati)算法阅......