Aseembly(八)-汇编语言编写程序

news2024/9/22 4:22:28

前言

在该系列的第六篇文章我们主要讲述了:关于栈的寄存器:SS和SP的问题
来回一下:
对于栈指针来说,栈在被开辟的时候,首先要通过SS指针去找到开辟栈的地址空间的首地址,随后,SP指针指向该栈空间的末尾的下一个空间处.当执行push指令时,sp会-2 随后将目标压入栈中
当执行pop指令时,会先将元素弹出,随后执行sp+2
还回顾了关于不同段寄存器的作用:
ds与[] 是读取数据
cs:ip是去寻找指令
而ss:sp与栈空间有关.
详情请看我的上一篇文章

Assembly(六)–寄存器总篇章

喜欢的小伙伴点赞关注支持一下~ 博主争取日更哦~
本篇文章我们将去透彻的理解一个完整的程序.

1.1 程序从写出到被执行的过程

  1. 编写汇编源程序 用汇编语言等语言编写程序的源程序
  2. 对原程序进行编译 link
    这部分可以参照我的另一篇文章:关于C++的编译和链接的新看法
    C++
  3. 执行可执行文件中的程序,有cs:ip指向第一条要执行的指令,然后由cpu执行程序

1.2 源程序的讲解

让我们来实际的看下一段汇编的程序吧

assume cs:codesg

codesg segment 
	mov ax,0123H
	mov bx,0456H
	add ax,bx
	add ax,ax
	
	mov ax,4c00H
	int 21H
codesg ends

end

关于程序,由以下几点要说明:
伪指令

  • 程序中出现的伪指令有:xxx segment xxx ends ,这个segment与ends是成对出现的,表示定义了一个段,这个段是xxx 像是程序中的 段名叫 codesg
  • end ,.end是代表着一个汇编程序的结束标志
  • assume 用来假设程序的某一个段与某个寄存器相联系,比如 其中的 assume cs:codesg 这里就跟cs寄存器联系起来了
    一个汇编程序通常由伪指令和汇编指令组成.经过编译链接后编程可执行文件.

练习:让我们来写一个计算2的三次方的程序吧:

assume cs:cac
cac segment 
	mov ax,2
	add ax,ax
	add ax,ax
cac ends 
end

十分简单
当我们考虑到:一个程序要有返回值时,问题就来了

1.3 程序的返回

观察之前的程序:

assume cs:codesg

codesg segment 
	mov ax,0123H
	mov bx,0456H
	add ax,bx
	add ax,ax
	
	mov ax,4c00H
	int 21H
codesg ends

end

我们不难看出有两条指令没有被提到:

mov ax,4c00H
int 21H

这两条指令所实现的功能就是程序返回
我们不必深究为什么,反转在end后面加两条指令就可以实现程序返回.

1.4 实战:

1. 在准备好的dosbox中,使用edit功能:

在这里插入图片描述
进行编辑
在这里插入图片描述
保存退出为1.asm
随后进行编译
使用masm.exe
在这里插入图片描述
这里先输入文件名,随后默认obj文件的名字 随后忽略文件生成列表和交叉引用文件
编译完成!
接下来开始链接:
使用link.exe
在这里插入图片描述
在忽略了 lib和无栈段生成后,我们成功的链接了文件.生成了exe文件
链接的作用是什么呢?
首先当程序很大的时候,可以分成多个文件来进行编译,自然链接到一起可以很方便
其次如果程序中强调了某个库文件的子程序,链接也十分必要了.

2. 编译 链接 跟踪

写文件t1.asm

assume cs:codesg
codesg segment
 mov ax.2000H
 mov ss,ax
 mov sp,0
 add sp.10
 pop ax
 pop bx
 push ax
 push bx
 pop ax
 pop bx
 mov ax,4c00H
 int 21H
 codesg ends
 end

在这里插入图片描述

然后进行编译 链接后使用debug进行调试

在这里插入图片描述
可以看到目前的cs:ip是在076A:0处
此时的SS是0769 sp为0
在这里插入图片描述
执行两次命令后,成功的将ax的值赋值给了ss
接下来就是执行sp的赋值了
其实这里的pop ax就是为了让sp=sp+2
连着两次都是
在这里插入图片描述

随后进行push操作 是为了让sp=sp-2
在这里插入图片描述

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

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

相关文章

volta引发的血案

什么是volta volta用于做项目级别的node版本控制,当手头上的项目有多个时,且node版本可能还不一样,我们需要不断切换node版本。使用volta可以很好的解决这个问题。只需要安装volta,然后在下面的package.json中配置好node版本即可…

鸿蒙HarmonOS实战开发: CMake脚本编写构建NDK工程

NDK工程构建 HarmonyOS NDK默认使用CMake作为构建系统,随包提供了符合HarmonyOS工具链的基础配置文件ohos.toolchain.cmake,用于预定义CMake变量来简化开发者配置。 常用的NDK工程构建方式有: 从源码构建 源码构建也有不同方式:…

机器学习在智能复合材料中的应用与实践

在人工智能与复合材料技术融合的背景下,复合材料的研究和应用正迅速发展,创新解决方 案层出不穷。从复合材料性能的精确预测到复杂材料结构的智能设计,从数据驱动的材料结构优 化到多尺度分析,人工智能技术正以其强大的数据处理能…

深度学习设计模式之策略模式

文章目录 前言一、介绍二、特点三、详细介绍1.核心组成2.代码示例3.优缺点优点缺点 4.使用场景 总结 前言 策略模式定义一系列算法,封装每个算法,并使它们可以互换。 一、介绍 策略模式(Strategy Pattern)是一种行为型设计模式&…

Linux:网络基础概念

网络发展 独立模式: 计算机之间相互独立; 网络互联: 多台计算机连接在一起, 完成数据共享; 局域网 LAN: 计算机数量更多了, 通过交换机和路由器连接在一起; 广域网 WAN: 将远隔千里的计算机都连在一起; 所谓 "局域网" 和 "广域网" 只是一个相对的概念. 比如…

【C++ 第十四章】红黑树

前言: 学习本章,需要先学习 AVL树的 旋转,因为 红黑树也需要旋转调整来平衡,下面讲解将不赘述 旋转的原理和操作 红黑树的旋转 和 AVL树的旋转 唯一不同的是:旋转的判断使用逻辑 AVL树的旋转 可以通过 平衡因子 判断…

关于c++ grpc 和 c# grpc 通信的问题 以及 grpc 认证问题

一、c 和 c# 通信 c# 端服务器 如果域名 输入的是 https ,则 c 端需要匹配使用,也就是c 端需要进行安全认证。如果是http 则c 端不需要认证(基于c#的grpc 未 通信成功) 参考如下网址可以写一个简单的 .net grpc服务器 &#xff08…

基于java的综合小区管理系统论文.doc

摘 要 如今社会上各行各业,都喜欢用自己行业的专属软件工作,互联网发展到这个时候,人们已经发现离不开了互联网。新技术的产生,往往能解决一些老技术的弊端问题。因为传统综合小区管理系统信息管理难度大,容错率低&am…

diamond安装与使用

1.前言 diamond是一款用于蛋白质和翻译后DNA搜索的序列比对工具,专为大规模序列数据的高性能分析设计。其主要特点包括: - 与BLAST相比,蛋白质和翻译后DNA的成对比对速度快100倍至10000倍。 2. 参考 https://github.com/bbuchfink/diamond …

微知-lspci如何查看pcie设备树状结构(-t)

对于查看pcie设备列表除了看是否存在 还需要看拓扑结构。如何看? lspci -t以减号为分割说明 第一列数字是域段 和 bus id。比如0000:00中0000是域 00是busid 第二列 01.2中01是device id。2是functionid 如果还有下游设备device还有一个指定busid的序号

[数据集][目标检测]夜间老鼠检测数据集VOC+YOLO格式316张1类别+视频文件1个

数据集格式:Pascal VOC格式YOLO格式(不包含分割路径的txt文件,仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数):316 标注数量(xml文件个数):316 标注数量(txt文件个数):316 标注类别…

I.MX6U交叉编译Qt项目-思维导图-学习笔记-基于正点原子阿尔法开发板

I.MX6U交叉编译Qt项目 安装交叉编译器 交叉编译器介绍 拷贝fsl-imx-x11-glibc-x86_64-meta-toolchain-qt5-cortexa7hf-neon-toolchain-4.1.15-2.1.0.sh至ubuntu 执行下面的指令修改脚本的权限,修改权限后可以看到此脚本颜色显示改变,说明修改成功 chmod…

理解Flink算子链

前言 对于flink初学者,如果我们观察WebUi中任务执行情况,可能会有一个疑惑,为什么节点和代码中的算子对不上? 从WebUi上看起来像是一个节点,会把转换处理的很多个任务都连接在一起,合并成了一个“大任务”。这又是怎么回事呢? 算子间的数据传输 我们先来考察一下算子…

Vue 旋转动画效果

目录 前言效果演示具体代码实现 前言 这里记录一个旋转动画&#xff0c;在鼠标经过的时候停止&#xff0c;鼠标离开继续旋转。 实现思路&#xff1a; 利用keyframes关键字定义一个旋转动画 效果演示 具体代码实现 <template><div class"container"><…

Cuda 基于Cmake创建Cuda项目

文章目录 一、简介1.1GPU的优势1.2 CUDA:通用并行计算平台和编程模型 二、Cuda项目三、实现效果参考资料 一、简介 1.1GPU的优势 图形处理单元(GPU)1在相同的价格和功率范围内提供比CPU高得多的指令吞吐量和内存带宽。许多应用程序利用这些更高的功能在GPU上比在CPU上运行得更…

ESP32-C3在MQTT访问时出现“transport_base: Poll timeout or error”问题的分析(7)

接前一篇文章:ESP32-C3在MQTT访问时出现“transport_base: Poll timeout or error”问题的分析(6) 上一回说到笔者分析base_poll_write函数中的select()返回的结果可能并不是超时而是负值,并且在base_poll_write函数中添加了打印,如下所示: 当时想着是更新固件并烧录之后…

学习笔记 韩顺平 零基础30天学会Java(2024.8.20)

P522 HashSet源码解读1 P523 HashSet源码解读2 开发技巧&#xff1a;在需要辅助变量或局部变量的时候再创建 P524 HashSet源码解读3 当单链表超过8个&#xff0c;但是还可以扩容的时候&#xff0c;将会把整条链表放到扩容后的最后应该位置上&#xff08;由老师讲解的16到32引起…

Windows SDK(八)模态对话框与非模态对话框

对话框的创建 对话框分为模态对话框和非模态对话框两种形式 模态对话框&#xff1a;自建消息循环&#xff0c;并且通过EnableWindow禁用了父窗口的键盘鼠标输入达到阻塞父窗口的功能。当有对话框&#xff0c;父窗口阻塞时&#xff0c;透过对话框是无法对父窗口进行操作的&…

【一起学Rust | 框架篇 | Tauri2.0框架】tauri中rust和前端的相互调用(rust调用前端)

文章目录 前言1. rust中调用前端2. 如何向前端发送事件3. 前端监听事件4. 执行js代码 前言 近期Tauri 2.0 rc版本发布&#xff0c;2.0版本迎来第一个稳定版本&#xff0c;同时官方文档也进行了更新。Tauri是一个使用Rust构建的框架&#xff0c;可以让你使用前端技术来构建桌面…

Redis7基础篇(六)

redis复制 目录 redis复制 前引 概念 能干嘛 怎么玩 基本操作 案例演示 前期配置 实操 常用三招 一主二仆 薪火相传 反客为主 复制原理和工作流程 复制的缺点 前引 redis复制这一篇有承上启下的作用 前面的 redis几乎是单机版 一台redis 概念 能干嘛 水平扩容…