8086汇编语言入门之HelloWorld_汇编语言如何看字符串“hello world”所在的段地址以及段内起始地址?-程序员宅基地

技术标签: 个人总结  反汇编  编译原理  


绪论:
      汇编语言是一门 面向机器编程的语言,与面向过程,面向对象的高级编程语言不同;编程者只需要调用模块方法就行,不需要关心寄存器与内存的分配问题,但是汇编语言就需要编程者多关心这类问题了。

一.学习汇编的目的

      总所周知,汇编语言并不普及吃香,作为计算机最底层的语言,其作用更多的是展现在硬件设计与开发的工作中,如嵌入式开发。帮助学习者深入理解计算机体系结构。学习汇编语言也能帮助理解高级语言。比如你明白System.out.println()是调用了System类,但是你知道类的具体调用原理吗?你知道#include是定义了宏,但你知道宏的具体内容是什么构成的吗?

      汇编语言编程,面向的是“寄存器”,寄存器是计算机CPU内部的一种超高速缓存(速度胜过内存数倍,但容量极小),对数据的各种操作都由“指令”来进行,也被称作汇编指令。所以从汇编的角度来说,程序就是指令。从电子电路硬件设计与开发的角度来看,程序就是集成电路里的高低平信号,通常1为高电平,0为低电平。信号通过解码器译码器转化为指令,继而被高级语言封装成代码与模块,方法,说白了就是指令集。这里扯远了,继续回到汇编这件事上。

二.汇编仿真软件工具推荐

仿真软件+debug工具:Masm for windos
在这里插入图片描述
如果你也想要这套工具,就在公众号里回复“汇编工具”即可。毕竟这玩意要绝种了,我们面向的是8086微处理器。

三.了解基本指令段

我将对比高级语言进行讲解,高级语言中,我们定义一个的时候,通常会定义它的数据成员变量,和成员方法;方法的话少不了构造方法之类的。汇编也如此,我们先定义一个数据段:
写法就是:

;datas segment相当于定义了一个数据段,用于存储代码中的数据
;datas ends表示数据段的结束
;------------------------------------------

内部的DB不要当成变量了,它是寄存器!寄存器的类型是STRING的。1310分别代表回车和空格。

DATAS  SEGMENT
     STRING  DB  'Hello World!',13,10,'$'
     ;'$'代表字符串结束
DATAS  ENDS

在定义一个代码段:

;codes segment相当于代码段开始
;codes ends相当于代码段结束
;start相当于main函数,作为函数入口
;----------------------------------
CODES  SEGMENT
     ASSUME    CS:CODES,DS:DATAS
START:;相当于main函数
     MOV  AX,DATAS
     MOV  DS,AX
     LEA  DX,STRING
     MOV  AH,9
     INT  21H
   
     MOV  AH,4CH
     INT  21H
CODES  ENDS
    END   START

你可能疑惑为什么要一开始定个代码段数据段。如果你只学过高级语言,那么定义这个没有为什么,因为那是规定,也就是代码的规范化。汇编语言为什么要定义这个呢?因为CPU内部及其内存长成这个样子。数据段+代码段+…段构成了内存。你用高级语言定义的变量都要在里面开一个内存单元的。我们看到如上图的指令包含了数据传送指令,指针地址指令,中断指令等等。中间的桥梁就是:

ASSUME    CS:CODES,DS:DATAS;关联了代码段寄存器CS和数据段寄存器DS

这种关联关系,类似于高级语言里方法调用成员变量及其属性的作用。数据段的寄存器存储的是立即数,也就相当于高级语言里的常量,那么在代码段里我们认定它的地址是不会改变的,我们需要用一个类似于指针的东西去指!指针除了出现在C和C++里就基本绝种了,因为不安全,它的安全性其实在C#里得到了提升,C#对于指针的运用还是比较常见的,主要是它安全了,因为它引入了委托的新概念,我委托一个新变量存储指针指向的新地址,不仅解决了容易内存溢出还解决了安全问题,,,等等,刹车,,,回到主话题。所用上文用到了指针指令lea,它能调用字符串开始的地址,我们的字符串就是Helloworld,我们知道它的存储单元地址是16位的,我们说过了它是寄存器存储的,那么先找到寄存器的偏移量地址。从而找到我们存储的这段指令,按高低位从内存进行读取,再存储到寄存器DX中。

四.汇编的执行【调用debug命令】

      高级语言走的也是这几个步骤,语言越高级,编译器越强大帮你省掉了几个步骤。但是,如果编译器出bug导致你的项目也出问题了?你有办法再快乐的coding了吗?学习汇编可以在一定程度帮你解决这些问题。汇编不是一门语言,而是一门集合了《计算机体系结构》《微机技术与接口》《操作系统》《汇编原理》的综合科学,底层架构是原理与体系结构。祝大家学习愉快,晚饭时间写了这篇博客,希望大家喜欢。这是一门需要连根拔起的理论+实践体系,学了它你可以玩反编译,反汇编搞po解。
我的这期po解,反汇编课程资料需要的可以私聊我:
在这里插入图片描述
我的微信:JL1714873054

编译 生成可执行文件
在这里插入图片描述 在这里插入图片描述
链接动态库文件 运行
在这里插入图片描述 在这里插入图片描述
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_43891901/article/details/105690452

智能推荐

eNSP的使用-程序员宅基地

文章浏览阅读1.6k次。1-进入华为路由器界面配置ipThe device is running!####################################Nov 1 2016 23:39:24-08:00 Huawei %%01IFNET/4/BOARD_ENABLE(l)[0]:Board 1 has been available. <Huawei>Nov 1 2016 23:39:2..._has been available.

python 偏函数(functoosl, partial)_functoosl.wrap-程序员宅基地

文章浏览阅读396次。functools在python中是一个很重要的模块,提供了很多有用的高阶函数(一个可以接受函数作为参数或者返回值是一个函数的 函数)。比如其中一个就是偏函数(Partial function)。在介绍函数参数时,我们就讲过,通过设定参数的默认值,可以降低调用函数的难道,比如: python中int函数,把字符串转换成数字,有一个参数是base,默认值是10,表示函数十进制转换,如果改变这个bas_functoosl.wrap

Vue中的nextTick方法的作用是什么?_vue nexttick的作用-程序员宅基地

文章浏览阅读365次。更新循环结束之后调用该回调函数。这样可以确保回调函数在操作更新后的。更新后执行回调的方式。这对于确保在更新视图后操作。通过将回调函数传递给。更新后执行的操作,例如获取渲染后的。更新循环结束之后执行延迟回调。元素的尺寸、触发子组件的更新等。更新视图时,通常是异步执行的,方法来处理一些需要在。_vue nexttick的作用

C语言实战演练_跳动的爱心c语言代码-程序员宅基地

文章浏览阅读817次,点赞7次,收藏8次。然后通过循环输出每一行的字符,根据每个点的函数值计算出它在爱心表面上的位置并输出相应的字符。接着通过GetConsoleWindow()获取控制台的句柄,进而获得控制台的大小和位置,计算出它应该出现的位置,并通过SetWindowPos函数移动控制台窗口到指定位置。接下来是代码的主要函数f,它用来计算出一个点在三维空间中的函数值,如果这个值小于等于0,则表明这个点在爱心的表面上。总的来说,这段代码通过控制台输出的方式,利用函数计算出每一个点在爱心表面上的位置,实现了一个动态的、跳动的爱心效果。_跳动的爱心c语言代码

MySQL调优分析篇1(SHOW PROFILES):SQL语句效率分析实战_mysql show profile 实战-程序员宅基地

文章浏览阅读399次。万级数据表全表查询SQL语句的耗时分析案例_mysql show profile 实战

R语言 给一组数,算 极大似然估计值_r语言求正态分布参数最大似然估计-程序员宅基地

文章浏览阅读809次,点赞2次,收藏13次。极大似然估计通常用于估计概率分布的参数。因此,具体的极大似然估计方法会依赖于你所假设的概率分布类型。下面我将为你提供一个通用的示例,用于估计一个简单的参数,假设数据服从正态分布。在这个示例中,我们假设数据服从正态分布,然后定义了正态分布的似然函数。假设你有一组数据,想要估计这些数据的均值和标准差的极大似然估计值。函数来最大化这个似然函数,从而估计均值和标准差的极大似然估计值。_r语言求正态分布参数最大似然估计

随便推点

MP3双声道转单声道的Python源码实现_python 单声道音频-程序员宅基地

文章浏览阅读122次。在音频处理中,有时需要将MP3文件的双声道音频转换为单声道音频。本文将为你提供一个使用Python编写的源码示例,用于实现这一功能。这个方法需要传入一个整数参数,表示希望转换后的音频有多少个声道。在这里,我们将其设置为1,即单声道。完成这些步骤后,运行代码就会将双声道的MP3文件转换为单声道,并保存为指定的输出文件。的函数,它接受输入文件路径和输出文件路径作为参数。首先,我们需要安装所需的Python库。方法将转换后的音频保存为MP3文件。参数替换为你实际的输入文件路径。参数替换为你实际的输出文件路径。_python 单声道音频

3D建模需不需要手绘板?看看热心网友怎么说_手绘板建模-程序员宅基地

文章浏览阅读3.1k次。手绘板,又被叫做数位板。头一次接触数位板的时候是在半年前,当时报的摄影课老师建议我们用手绘板,然后在咨询了很多人之后,我购入了一块手绘板。手绘板到手的时候,我顿时感觉自己大触附体,感觉自己马上就能创作出世界名画,但是手绘板用起来的时候却很奇怪,笔在板子上画的时候很滑,于是我花了半个月的时间适应这块不同于键盘鼠标的板子。那么回到正题,到底需不需要一块手绘板呢?如果是一些领域的专业人员,我只能说,太需要了!如果是某些领域的发烧级爱好者,一块手绘板也能体会到不同的天地。而对于我来说,没了鼠标没问题,没_手绘板建模

2023.05-B卷-华为OD机试 - AI面板识别-”新加题型“(100分值)-程序员宅基地

文章浏览阅读166次。最近我们一直在将收集到的各种大厂笔试的解题思路还原成题目并制作数据,挂载到我们的OJ上,供大家学习交流,体会笔试难度。现已录入200+道互联网大厂模拟练习题,还在极速更新中。欢迎关注公众号“塔子哥学算法”获取最新消息。

树莓派轮盘游戏机[嵌入式系统]-程序员宅基地

文章浏览阅读230次。LAB7:轮盘游戏机视频地址:http://v.youku.com/v_show/id_XNTY5MzAyODgw.htmll 实验要求:在RPi的Linux上做一个轮盘游戏机,具有两个按钮,一个负责启动,一个负责停止。具有某个或多个输出设备,如 LED、LED矩阵、双位7段数码管、LCD、蜂鸣器、舵机等,可任选其中一个或多个的组合。按下启动按钮,输出设备上 就出现各种变化...

Java项目基于ssm+vue.js的高校运动会管理系统附带文章和源代码设计说明文档ppt_基于ssm的高校运动会管理系统ppt-程序员宅基地

文章浏览阅读863次,点赞17次,收藏22次。博主介绍:CSDN特邀作者、985计算机专业毕业、某互联网大厂高级全栈开发程序员、码云/掘金/华为云/阿里云/InfoQ/StackOverflow/github等平台优质作者、专注于Java、小程序、前端、python等技术领域和毕业项目实战,以及程序定制化开发、全栈讲解、就业辅导、面试辅导、简历修改。精彩专栏 推荐订阅2023-2024年最值得选的微信小程序毕业设计选题大全:100个热门选题推荐2023-2024年最值得选的Java毕业设计选题大全:500个热门选题推荐。_基于ssm的高校运动会管理系统ppt

SpringBoot项目扫描不到其他SpringBoot项目jar包下类的问题(maven插件导致)_springboot扫描不到其他模块的包(1)-程序员宅基地

文章浏览阅读655次,点赞6次,收藏14次。然后在另一个Application中的pom.xml引入了相应依赖(比如是test-a.jar),但是SpringBoot程序启动时找不到test-a.jar中的所有类。但是可以找到其他依赖jar包的类。事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!通过对比结果发现:扫描不到的jar包是使用SpringBoot的maven插件打的包。