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

引言

        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 segmentdb 16 dup (0)
stack ends
code segment
start:mov ax, 0call s      ;执行该指令的内部逻辑步骤:(1) pop IP(即指向inc ax指令的首地址); ;                       (2)IP = IP + (s标号处指令的首地址 - call s指令的下一条指令(即 inc ax指令)的首地址)inc ax
s: pop axmov ax, 4c00hint 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 segmentdb 16 dup (0)
stack ends
code segment
start:;初始化栈mov ax, stack       ;ax = 204Dmov ss, ax          ;初始化栈:设置栈段地址ss = 204Dmov sp, 16          ;设置栈顶地址sp = 16mov ax, 0call far ptr s      ;(1)push CS (2)push IP (3)CPU转移到标号S处执行指令inc ax
s:pop ax              ;IP的值出栈add ax, axpop bx              ;CS的值出栈add ax, bx          mov ax, 4c00hint 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 segmentdb 16 dup (0)
stack ends
code segment
start:;初始化栈mov ax, stackmov ss, axmov sp, 16mov ax, 14call ax         ;(1)push IP (2)CPU转到 (ax寄存器) 处执行指令inc axmov bp, spadd ax, [bp]mov ax, 4c00hint 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版)》王爽

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/403058.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java流程控制09:练习题:打印三角形

本节视频链接:https://www.bilibili.com/video/BV12J41137hu?p44&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5https://www.bilibili.com/video/BV12J41137hu?p44&vd_sourceb5775c3a4ea16a5306db9c7c1c1486b5 通过嵌套for循环可以实现打印三角形&#xff…

使用C#禁止Windows系统插入U盘(除鼠标键盘以外的USB设备)

试用网上成品的禁用U盘的相关软件,发现使用固态硬盘改装的U盘以及手机等设备,无法被禁止,无奈下,自己使用C#手搓了一个。 基本逻辑: 开机自启;启动时,修改注册表,禁止系统插入USB存…

银河麒麟服务器操作系统Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤

银河麒麟服务器操作系统 Kylin-Server-V10-SP3-2403-Release-20240426-x86_64安装步骤 一、准备工作1. 下载ISO镜像2. 制作安装介质3. 设置BIOS 二、安装过程1. 启动系统2. 选择安装语言3. 选择安装配置4. 配置root密码与创建用户5. 开始安装6. 重启系统7. 同意许可协议 三、系…

通义千问( 四 ) Function Call 函数调用

4.2.function call 函数调用 大模型在面对实时性问题、私域知识型问题或数学计算等问题时可能效果不佳。 您可以使用function call功能,通过调用外部工具来提升模型的输出效果。您可以在调用大模型时,通过tools参数传入工具的名称、描述、入参等信息。…

C语言(16)——初识单链表

1.链表的概念及结构 概念:链表是⼀种物理存储结构上⾮连续、⾮顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 结构图: 补充说明: 1、链式机构在逻辑上是连续的,在物理结构上不⼀定连续 2、…

Oracle Java JDK 21 下载地址及安装教程

Oracle JDK 21 官方地址 https://www.oracle.com/java/technologies/downloads/#java21 1. Linux 版本 ARM64 Compressed Archive https://download.oracle.com/java/21/latest/jdk-21_linux-aarch64_bin.tar.gz ARM64 RPM Package https://download.oracle.com/java/21/late…

Python爬虫图片:从入门到精通

在数字化时代,图片作为信息传递的重要媒介之一,其获取和处理变得越来越重要。Python作为一种功能强大且易于学习的编程语言,非常适合用来编写爬虫程序,帮助我们自动化地从互联网上获取图片资源。本文将从基础到高级,详…

【qt】跳转到另一个界面

如何在一个界面跳转到另一个界面呢? 1.具体步骤 1.先新建一个界面 2.选择qt设计师界面 3.选择W 4.新界面名称 5.界面设计 因为我们要实现通信,需要一个发送信息栏,一个发送按钮,一个清空发送栏按钮 6.实现跳转 我们可以参…

python 已知x+y=8 求x*y*(x-y)的最大值

先用导数求解 已知xy8 求xy(x-y)的最大值 令y8-x 则 f(x)x⋅(8−x)⋅(x−(8−x))x⋅(8−x)⋅(2x−8) 导数方程为 f(x)-3x^2 24x - 32 求方程 − 3 x 2 24 x − 32 0 -3x^2 24x - 32 0 −3x224x−320 的根。 首先,我们可以尝试对方程进行因式分解。观察…

Airtest 的使用

Airtest 介绍 Airtest Project 是网易游戏推出的一款自动化测试框架,其项目由以下几个部分构成 Airtest : 一个跨平台的,基于图像识别的 UI 自动化测试框架,适用于游戏和 App , 支持 Windows, Android 和 iOS 平台&#xff0c…

鸿蒙应用程序框架基础

鸿蒙应用程序框架基础 应用程序包基础知识应用的多Module设计机制Module类型 Stage模型应用程序包结构开发态包结构编译包形态发布台包结构选择合适的包类型 应用程序包基础知识 应用的多Module设计机制 **支持模块化开发:**一个应用通常会包含多种功能&#xff0…

为什么MCU I2C波形中会出现的脉冲毛刺?

在I2C的波形中,经常会发现有这样的脉冲毛刺,会被认为是干扰或者器件不正常。 看到这个波形时,可以先数一下出现在第几个clock的位置,如果出现在第9个clock的低电平期间,就不是干扰或者器件异常导致。 在I2C的协议中&a…

虎牙驶入快车道

撰稿 | 多客 来源 | 贝多财经 一份Q2财报,狠狠打脸了那些唱反调的人,特别是故意唱衰直播和游戏公司的一些TMT观察者。 同时,直播平台如何健康转型实现可持续发展,游戏相关服务业务应该怎么做增量,虎牙的这份财报也给…

【Kubernetes】虚拟 IP 与 Service 的代理模式

虚拟 IP 与 Service 的代理模式 1.userspace 代理模式2.iptables 代理模式3.IPVS 代理模式 由于 Service 的默认发布类型是 ClusterlP,因此也可以把 ClusterIP 地址叫作 虚拟 IP 地址。在 Kubernetes 创建 Service 时,每个节点上运行的 kube-proxy 会自动…

golang基于WMI获取所有外接硬盘(USB,移动硬盘)信息

golang基于WMI获取所有外接硬盘(USB,移动硬盘)信息 package mainimport ("fmt""regexp""github.com/StackExchange/wmi""github.com/shirou/gopsutil/v3/disk" )// 定义 WMI 类结构体 type Win32_LogicalDiskToPartition struct {Ant…

高数4.2 积分方法-换元积分法

1. 第一类换元积分法 2. 第二类换元积分法

算法【Java】 —— 滑动窗口

滑动窗口 在上一篇文章中,我们了解到了双指针算法,在双指针算法中我们知道了前后指针法,这篇文章就要提到前后指针法的一个经典的使用 —— 滑动窗口,在前后指针法中,我们知道一个指针在前,一个指针在后&a…

JavaScript初级——运算符

一、算数运算符 1、运算符也叫操作符。通过运算符可以对一个或多个值进行运算,并获取运算结果。 比如:typeof 就是运算符,可以获得一个值的类型,他会将该值的类型以字符串的形式返回 (number、string、boolean、undefi…

【秋招笔试】8.12-4399秋招(第一套)-三语言题解

🍭 大家好这里是 春秋招笔试突围,一起备战大厂笔试 💻 ACM金牌团队🏅️ | 多次AK大厂笔试 | 编程一对一辅导 ✨ 本系列打算持续跟新 春秋招笔试题 👏 感谢大家的订阅➕ 和 喜欢💗 和 手里的小花花🌸 ✨ 笔试合集传送们 -> 🧷春秋招笔试合集 🍒 本专栏已收…

计算机网络12——IM聊天系统——项目分析和架构搭建

1、IM——聊天系统主要功能 (1)注册 根据:昵称,手机号,密码 (2)登录 根据:手机号,密码 (3)添加好友 根据:昵称 (4&…