手撕汇编。。。

汇编系列文章已经更新了三篇,每一篇都是笔者用心总结,希望对你有帮助

手把手教你汇编 Debug

爱了爱了,这篇寄存器讲的有点意思

之前的文章我们主要聊了一些基本的汇编指令,并且通过一个名为 Debug 的调试软件,让我们看到了内存中是如何存储指令和数据的,在学习了这些之后,我们就可以了解汇编程序了。

程序的执行过程

首先通过一个示意图给大家介绍一下程序的执行过程,我们以 C 语言一个简单的 hello.c 程序为例。

image-20211203203151861

所以,总结一点来说,编写一个汇编程序主要分为下面这几步

  • 首先定义一个段 ,比如 code、abc 等
  • 在段中写入汇编指令
  • 指出程序在何时处结束
  • 标号要和寄存器关联起来。
  • 程序返回(后面要说)

程序返回

一个完整的程序是要有返回条件的,程序只有在执行完相关代码后,执行返回条件,让出 CPU 执行权,操作系统才会分配时间片给其他程序,程序不能一直霸占着 CPU 不放,这是一种资源的浪费,而且一直占用着 CPU,也会导致程序崩溃。

汇编语言中,实现程序返回的指令只有两行

解释下这两句指令的意思:

mov ax,4c00H 就是把 4c00 移动到 ax,中,INT 21H 是调用系统中断指令,这两句代码起作用的就是 AH = 4CH,意思就是调用 INT 21H 的 4CH 号中断,该中断就是安全退出程序。

到目前为止,我们已经了解到了几种和结束的相关内容,比如段结束,汇编程序结束、还有我们刚刚说的程序返回,下表列出了这三个指令的区别。

image-20211206222357207

运行 masm 后,首先会显示一些版本信息,然后输入需要被编译的原程序文件名称,这里需要注意一下,提示我们,默认的文件扩展名是 asm,比如我们要编译的源程序文件名是 ,这里直接输入 asm 即可。如果源程序文件不是以 .asm 为后缀,需要输入它的全名,也就是 test.txt。

这里我们输入的是 test,因为我们编写的文件是 .asm 后缀。

image-20211207192942324

运行 link 后,会出现一些版本信息,然后提示需要被连接的目标文件名称,这里仍需要注意,默认文件是 .obj 结尾,所以如果你需要连接的文件是 obj 文件,就不用输入后缀名,如果不是 obj 文件,则需要输入全名。

我们刚刚编译了一个 test.obj 文件,所以我们直接对这个 obj 文件进行连接。

输入要连接的文件名(这里仍需要输入 obj 所在的路径),按 enter 。

image-20211207194410472

这个提示只是告诉我们没有栈段,我们可以完全忽略这个提示,当然如果你的程序有问题,是无法生成连接之后的文件的。

连接这个过程很有用,归结来说,主要有三个作用

  • 当源程序很大时,可以将它分为多个源程序文件来进行编译,每个单独编译之后的目标文件,可以再通过连接将它们连接到一起生成可执行文件。
  • 程序中调用了某个库文件中的子程序,需要将这个库文件和目标文件连接到一起生成一个可执行文件。
  • 在编译过后生成的机器码文件,其中有些内容还不能直接执行,连接程序需要将这些内容转换为可执行信息,才能够把编译过后的机器码文件,连接成为可执行文件。

执行应用程序

现在我左手一个 asm 文件,右手一个 obj 文件,嘴里叼着一个 exe 文件,所以我就是嘴遁王者。废了半天劲,终于将 asm 搞成 exe 文件了,累屁了,不过先别急着休息,还差最后一步,执行它!

于是我们执行以下 TEST.EXE 文件

image-20211207202534720

如果这篇文章写的不错并且对你有一些帮助,那我就求个赞呀!

文章知识点与官方知识档案匹配,可进一步学习相关知识C技能树首页概览113306 人正在系统学习中

手撕汇编。。。 微信公众号 手撕汇编。。。 公众号回复”cxuan”领取作者手写的六本PDF。

来源:程序员cxuan

声明:本站部分文章及图片转载于互联网,内容版权归原作者所有,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2021年11月8日
下一篇 2021年11月8日

相关推荐