【汇编要笑着学】汇编模块化编程 | call和ret调用指令 | jmp跳转指令 | inc自加指令

news2025/2/27 8:45:52

Ⅰ.汇编模块化编程

0x00 一个简单的例子

我们了解模块化编程前先给出一个例子,方便大家快速了解。

SECTION MBR vstart=0x7c00 ; 起始地址编译在0x7c00
    mov ax,cs             
    mov ds,ax             
    mov es,ax
    mov ss,ax
    mov fs,ax
    mov sp,0x7c00   ; 上面这些都没什么用,但是都是必须的
                    ; 就把这些理解为初始化吧    

    call main

    jmp $

eax_plus_1s:
    inc eax
    ret

ebx_plus_1s:
    inc ebx
    ret

main:
    mov eax, 0
    mov ebx, 0
    call eax_plus_1s
    call eax_plus_1s
    call ebx_plus_1s
    add eax, ebx
    ret

times 510 - ($ - $$) db 0 
db 0x55,0xaa

这段代码用到了了我们今天要学的所有知识。

我们用bochs运行一下。

什么?这次几天,你就忘了?

算了,重新发一下命令。

nasm -o a.bin a.S
dd if=a.bin of=hd60M.img bs=512 count=1 conv=notrunc
bochsdbg -f bochsrc

输入c运行等一会后,再输入r命令查看寄存器数据。

得到结果3。

 

这段代码实际上看意思应该就大概知道了。

0x01 代码段

首先我们讲讲代码段,也就是上面代码中的。

main:
    ...

格式如下:

代码段名:
    代码段

 或者

代码段名称: 代码

代码段中的本质到底是什么呢?

我们可以大胆猜测一下,有如下可能:

  • 类似c语言中的函数
  • 类似c语言中的标签

我们可以把这个存入ax看一下试试。

SECTION MBR vstart=0x7c00 ; 起始地址编译在0x7c00
    mov ax,cs             
    mov ds,ax             
    mov es,ax
    mov ss,ax
    mov fs,ax
    mov sp,0x7c00   ; 上面这些都没什么用,但是都是必须的
                    ; 就把这些理解为初始化吧    

    mov ax, main

    jmp $
    
    times 510 - ($ - $$) db 0 
    db 0x55,0xaa

运行试试。

7c18应该就是一个地址,那就和c语言的标签类似。

call指令就是调用代码段,和函数调用差不多。

jmp就和c语言的goto差不多。

里面的

jmp $

就是原地循环,$就是当前指令的地址。

ret指令和return差不多。

Ⅱ.call和ret调用指令

0x00 call指令语法

call指令语法很简单:

call 标号

功能如下:

  call指令可以实现调用一个子程序,在子程序里使用ret指令结束子程序的执行并返回主程序(类比C语言中的main函数调用cube函数进行理解),主程序继续往下执行。

0x01 call指令本质

call指令是一个流程转移指令,就是让程序执行的顺序发生短暂的改变,去执行别处地址上的指令,遇到ret指令后再回到原来的地方继续往下顺序执行,本质和jmp大同小异,区别是在jmp基础上增加了程序回到原来跳转处的功能。

执行的指令如下:

  • 第一步:将当前的ip或者cs和ip压入栈中。即跳转前保存call指令的下一条指令的首地址
  • 第二步:转移到标号处执行子程序。即修改ip或者cs和ip里的内容

例子?懒得写了

Ⅲ.jmp跳转指令

0x00 什么是jmp指令

接下来就是jmp指令了!

感觉今天这篇怪水的...

cpu要执行指令之前必须先取指(把指令从内存传输到cpu中),从而必须要给出指令所在内存单元的物理地址,寄存器cs:ip就是这个物理地址所对应的段地址和偏移地址(段地址16+偏移地址=物理地址*),而jmp指令就是用来修改ip或者cs和ip的内容,使cpu执行jmp所指向的那条指令(发生跳转/转移),不会执行原定顺序的下一条指令。所以jmp指令要给出两个信息,如下:
jmp指令要给出两种信息:

  1. 转移的目的地址
  2. 转移的距离/偏移地址(距离不同转移的类型不同)
  • 段间转移(远转移):同时修改cs和ip
  •    段内短转移:jmp short 标号 ;只修改ip的值,ip的修改范围为-128~127(负数跳转方向是jmp指令之前,否则是之后),8位的位移
  •   段内近转移:jmp near ptr 标号 ;只修改ip的值,ip的修改范围为-32768~32767,16位的位移

0x01 jmp指令格式

备注:在源程序中,不能直接使用“jmp 2000:0100"这样的转移指令来实现段间转移,这种方式在debug模式中使用的汇编指令,在源程序中写,编译器并不识别(编译报错)

懒得写了,截的别人的图。

例子?懒得写了

我们这个都是按照上面图片讲的,例子都没有。

Ⅳ.inc自加指令

这个指令应该是我们这节课最简单的一个指令了。

0x00 inc指令是什么

inc指令差不多相当于c语言中的++一样,不过没有先后一说。

也就是

inc ax

相当于汇编中的

add ax, 1

这也太tm简单了,我就不再讲了。

        总结:
        这节课主要讲的就是汇编模块化编程,还有一个自加指令。
        还是很简单的。

        最后建议大家还是自己多试试,不要只看:
        纸上得来终觉浅,绝知此事要躬行。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

低代码开发平台

低代码开发平台(LCDP)本身也是一种软件,它为开发者提供了一个创建应用软件的开发环境。看到“开发环境”几个字是不是很亲切?对于程序员而言,低代码开发平台的性质与IDEA、VS等代码IDE(集成开发环境&#x…

Python 自学(八) 之模块

目录 1. import语句导入模块 P206 2. from ... import 语句导入模块 P207 3. 模块的搜索目录 sys.path P209 4. 以主程序的形式执行 __name__ P212 5. python中的包 P213 1. import语句导入模块 P206 同一目录下&…

centos7下搭建ldap服务器

参考: 全网最全Centos7.9搭建LDAP服务器图形界面_ldap服务器搭建-CSDN博客 LDAP服务搭建 - 简书 https://www.cnblogs.com/netsa/p/16017326.html 安装 #安装ldap服务 yum install -y openldap-servers openldap-clients openldap openldap-devel compat-openl…

centos docker-compose安装教程-2024最新版 亲测可用

目录 长时间不安装,生疏了,再次记录下 1.下载 2.修改名称 3.提权 4.测试验证 长时间不安装,生疏了,再次记录下 1.下载 官网地址 docker-compose官网地址:https://docs.docker.com/compose/compose-file/compose-file-v3/ #进入目录 cd /usr/local/bin#下载 wg…

统信UOS操作系统上禁用IPv6

原文链接:统信UOS操作系统上禁用IPv6 hello,大家好啊!继之前我们讨论了如何在麒麟KYLINOS上禁用IPv6之后,今天我要给大家带来的是在统信UOS操作系统上禁用IPv6的方法。IPv6是最新的网络通信协议,但在某些特定的网络环境…

首次落地零担快运!商用车自动驾驶跑出交付加速度

即将迈入2024年,还活着的自动驾驶玩家,身上有两个显著标签:选对了细分赛道、会玩。 10月以来,Cruise宣布在美国德州奥斯汀、休斯顿、亚利桑那州凤凰城和加州旧金山全面停止所有自动驾驶出租车队运营服务,通用汽车计划…

解决:Windows 无法访问指定设备、路径或文件。你可能没有适当的权限访问改项目。

故障情况:双击打开我的电脑和文件夹均弹出图上提示。右击可以打开,任务栏WIN开始 打不开,时钟和通知都点不开,所有系统自带的软件统统无法打开,但第三方软件可以正常打开。 故障原因:钉钉DingTalk_v7.5.0.…

SpringMVC RESTful

文章目录 1、RESTful简介a>资源b>资源的表述c>状态转移 2、RESTful的实现3、HiddenHttpMethodFilter 1、RESTful简介 REST:Representational State Transfer,表现层资源状态转移。 a>资源 资源是一种看待服务器的方式,即&…

Python开源项目周排行 2024年第2周

点赞关注转发三连,您的支持是我的动力! Python 趋势周报,按周浏览往期 GitHub,Gitee 等最热门的Python开源项目,入选的项目主要参考GitHub Trending,部分参考了Gitee和其他。排名不分先后,都是当周相对热门的项目。 …

[开发语言][c++]:Static关键字和全局变量

Static关键字和全局变量 1. 生命周期、作用域和初始化时机2. 全局变量3. Static 关键字3.1 面向过程3.1.1 静态全局变量3.1.2 静态局部变量(单例中会使用)3.1.3 静态函数 3.2 面向对象3.2.1 类内静态成员变量3.2.2 类内静态成员函数 Reference 写在前面&…

蓝桥杯练习题(九)

📑前言 本文主要是【算法】——蓝桥杯练习题(九)的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 …

ArrayBlockingQueue的使用

异步日志打印模型概述 在高并发、高流量并且响应时间要求比较小的系统中同步打印日志已经满足不了需求了,这是因为打印日志本身是需要写磁盘的,写磁盘的操作会暂时阻塞调用打印日志的业务线程,这会造成调用线程的rt增加。 如图所示为同步日…

C# Winform翻牌子记忆小游戏

效果 源码 新建一个winform项目命名为Matching Game,选用.net core 6框架 并把Form1.cs代码修改为 using Timer System.Windows.Forms.Timer;namespace Matching_Game {public partial class Form1 : Form{private const int row 4;private const int col 4;p…

C#中的反射(Reflection)使用经典案例

文章目录 1. 动态加载和调用类的方法2. 记录用户修改行为3. 调用私有构造函数4. 泛型类型的动态创建和使用5. 动态类型转换与检查6. 获取和设置私有、受保护成员7. 枚举程序集、模块、类型等信息8. 处理泛型类型参数9. 动态生成代码或动态编译10. 配置驱动的应用程序扩展注意事…

粒子群算法优化RBF神经网络回归分析

目录 完整代码和数据下载链接:粒子群算法优化RBF神经网络回归分析(代码完整,数据齐全)资源-CSDN文库 https://download.csdn.net/download/abc991835105/88738570 RBF的详细原理 RBF的定义 RBF理论 易错及常见问题 RBF应用实例,基于rbf的空调功率预测 代码 结果分析 展望…

动态规划篇-03:打家劫舍

198、打家劫舍 状态转移方程 base case 边界问题就是:走到最后一间房子门口也没抢,那么最终抢到的金额为0 明确状态 “原问题和子问题中会变化的变量” 抢到的金额数就是状态,因为随着在每一件房子门口做选择,抢到的金额数会随…

Springboot3新特性:开发第一个 GraalVM 本机应用程序(完整教程)

在讲述之前,各位先自行在网上下载并安装Visual Studio 2022,安装的时候别忘了勾选msvc 概述:GraalVM 本机应用程序(Native Image)是使用 GraalVM 的一个特性,允许将 Java 应用程序编译成本机二进制文件&am…

VS2019中解决一些配置问题

一、取消一堆冗余的C语法告警 1.点击项目最下面的属性栏 2.选择代码分析,点击常规,将其中的设置全部改为否,确定即可

GRE隧道(初级VPN)配置步骤

一、拓朴图: 二、配置步骤: 1、配置IP 2、R1、R2 配置nat,代理内网地址通过G0/0/0口上外网 acl 2000rule permit source anyquit # int G0/0/0ip addr 100.1.1.1 24nat outbound 2000 # 3、R1、R2 配置默认出口路由G0/0/0,这一…

【开源】基于JAVA+Vue+SpringBoot的桃花峪滑雪场租赁系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 游客服务2.2 雪场管理 三、数据库设计3.1 教练表3.2 教练聘请表3.3 押金规则表3.4 器材表3.5 滑雪场表3.7 售票表3.8 器材损坏表 四、系统展示五、核心代码5.1 查询教练5.2 教练聘请5.3 查询滑雪场5.4 滑雪场预定5.5 新…