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

Ⅰ.汇编模块化编程

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简单了,我就不再讲了。

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

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

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

系列十、Spring Security登录接口添加验证码

一、Spring Security登录接口添加验证码 1.1、概述 一般企业开发中,登录时都会有一个验证码,基于Spring Security的登录接口默认是没有验证码的?那么如何把验证码功能集成到Spring Security的登录接口呢?请看下文! 1.…

基于SSM的仓库在线管理系统

末尾获取源码 开发语言:Java Java开发工具:JDK1.8 后端框架:SSM 前端:Vue 数据库:MySQL5.7和Navicat管理工具结合 服务器:Tomcat8.5 开发软件:IDEA / Eclipse 是否Maven项目:是 目录…

C++学习笔记——输入、输出和文件

目录 一、标准输入输出 2.1下面是它们的基本用法 解释 二、格式化输入输出 2.2下面是一个示例 解释 三、文件读写 3.3下面是一个文件读写的示例 解释 四、异常处理和错误检测 4.1下面是一个示例 解释 五、一个实例代码 5.1如何读取 CSV 文件,并计算每…

大厂是怎么做支付系统的流程容错的?

点击下方“JavaEdge”,选择“设为星标” 第一时间关注技术干货! 1 单据关联 如某些订单域内部的多种单据间存在关联关系一样,支付设计上也有单据间关联设计。如所有逆向过程都须持有正向的单据,因此退款须关联到原来的支付&#…

LTESniffer:一款功能强大的LTE上下行链路安全监控工具

关于LTESniffer LTESniffer是一款功能强大的LTE上下行链路安全监控工具,该工具是一款针对LTE的安全开源工具。 该工具首先可以解码物理下行控制信道(PDCCH)并获取所有活动用户的下行链路控制信息(DCI)和无线网络临时…

为了这口醋,包的这饺子。为了Selenium,学有限的CSS,逐步替换XPATH

Learn about CSS rules and pseudo-classes to help you move your XPATH locators to CSS. 1. 最基本IdElement TypeDirect ChildChild or Sub-ChildClass 2. 深入一点Next SiblingAttribute ValuesChoosing a Specific Match Sub-String Matches 3 参考资料 In order for Sel…

Java零基础教学文档第五篇:jQuery

今日新篇章 【jQuery】 【主要内容】 jQuery简介 jQuery安装 jQuery语法 jQuery选择器 jQuery事件处理 jQueryDOM操作 jQuery元素遍历 jQuery过滤 jQuery其它方法 【学习目标】 1.jQuery简介 1.1 jQuery简介 jQuery 库可以通过一行简单的标记被添加到网页中。 1.…

java自动化将用例和截图一起执行测试放入world中直接生成测试报告【搬代码】

1.首先我们得用例写好之后放入文档中,把不用的案例类型、前置条件去掉之后,如图: 放到桌面后,先看执行结果: 直接上代码 package com.znzdh.qitagongju;import jxl.Sheet; import jxl.Workbook; import org.apache…

了解集群,以及集群是什么?

每个集群即一个独立运行的文档数据库,分片集群架构由路由(mongos)、配置(config)和分片(shard)组成。 数据读写请求经mongos分发,通过查询config信息,并行分配到相应sha…

C语言之字符串和指针

目录 用数组实现的字符串和用指针实现的字符串 █用数组实现的字符串str █用指针实现的字符串ptr 注意 用数组和指针实现字符串的不同点 字符串数组 用数组实现的字符串的数组——二维数组 用指针实现的字符串数组——指针数组 注意 字符串和指针有着紧密的联系&#…

力扣(105. 从前序与中序遍历序列构造二叉树,106. 从中序与后序遍历序列构造二叉树)

题目1链接 题目1: 思路:使用前序确定根,使用中序分左右子树,分治法。 难点:如何控制递归确定左右子树。 /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* T…

【STM32】FLASH闪存

1 FLASH闪存简介 本节所指STM32内部闪存,即下载程序的时候,程序存储的地方。(非易失性) STM32F1系列的FLASH包含程序存储器、系统存储器(bootloader,不允许修改)和选项字节三个部分&#xff0…

华西建筑智能化寻找志同道合的创业团队

我今天四十多了,之前也创过业,做软件开发系统集成的。 19年进入华西建筑装饰工程有限公司负责机电安装及弱电智能化版块。后公司成立建筑智能化事业部,我负责。现在想全身心打造施工企业项目管理平台,同时进军智慧康养领域。我想…

1.5矩阵元素的引用

通过下标来引用矩阵的元素 A(3, 2)表示A矩阵第3行第2列的元素。 >> arr [1,2,3;4,5,6]; >> arr(4, 5) 10arr 1 2 3 0 04 5 6 0 00 0 0 0 00 0 0 0 10>> 如果引用元素超过矩阵的大小将自…

Windows下面基于pgsql15的备份和恢复

一、基础备份 1.创建一个文件用来存储备份数据 2.备份指令 $CurrentDate Get-Date -Format "yyyy-MM-dd" $OutputDirectory "D:\PgsqData\pg_base\$CurrentDate" $Command "./pg_basebackup -h 127.0.0.1 -U postgres -Ft -Pv -Xf -z -Z5 -D $O…

Navicat 16 for MySQL:打造高效数据库开发管理工具

随着数据的快速增长和复杂性的提升,数据库成为了现代应用开发中不可或缺的一部分。而在MySQL数据库领域,Navicat 16 for MySQL作为一款强大的数据库开发管理工具,正受到越来越多开发者的青睐。 Navicat 16 for MySQL拥有丰富的功能和直观的界…

功能权限篇

文章目录 1. 如何设计一套权限系统1.1 目标1.2 权限模型1.2.1 模型一RBAC1.2.2 模型二ABAC 2.如何实现菜单的创建?2.1 表结构2.2 前端实现2.3 后端实现 3. 如何实现角色的创建?4.如何给用户分配权限 —— 将菜单赋予角色?5.如何给用户分配权限…

sqlilabs第五十三五十四关

Less-51(GET - GET - Error based - ORDER BY CLAUSE-String- Stacked injection) 手工注入 单引号闭合,和上一关一样堆叠注入解决 自动注入 和上一关一样 Less-52(GET - challenge - Union- 10 queries allowed -Variation 1) 手工注入 这一关开始后面的可以看…

设计模式之备忘录模式【行为型模式】

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档> 学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您: 想系统/深入学习某…

QT上位机开发(函数运行时间分析)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing 163.com】 软件除了功能开发、debug之外,另外一个很重要的部分就是软件的优化和提高。这里面的优化,当然就是希望软件能够处理更多的数…