当前位置: 首页 > news >正文

(四)汇编语言——简单程序

目录

编写程序的工作过程

编写汇编源程序

伪指令

汇编指令

注释

编写步骤

编译连接

编译 

连接

运行

 总结


编写程序的工作过程

        接下来,我们简单介绍一下一个汇编程序,从写出到最后执行,他到底经历了哪些步骤。

编写汇编源程序

        首先第一步,我们需要编写我们的汇编程序。这个程序的后缀名为.asm。 我们对这段代码详细的分析一下。

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

伪指令

        下面的4行代码就是伪指令, 伪指令是由编译器来执行的指令,编译器根据伪指令来进行相关的编译工作。没有对应的机器码的指令,最终不被CPU所执行。

assume cs:codesg
codesg segment 

    ..............

codesg ends
end

段定义 

        这是段定义,一个汇编程序是由多个段组成的,这些段被用来存放代码、数据或当作栈空间来使用。主要的结构就是:段名+segment 为段的开始,段名+ends 为段的结束。

codesg segment

codesg ends

假设

        这行代码是假设(assume), 含义是假设某一段寄存器和程序中的某一个用segment…ends定义的段相关联——assumecs:codesg指CS寄存器与codesg关联,将定义的codesg当作程序的代码段使用。

assume cs:codesg

结束

        end,是汇编程序结束的标记。

end

汇编指令

        这些就是汇编指令,对应有机器码的指令,可以被编译为机器指令,最终被CPU执行。但是在汇编指令里面。还有一部分程序返回,有点类似于C语言的return那样。

	mov ax,0123H
	mov bx,0456H
	add ax,bx
	add ax,ax

	mov ax,4c00H
	int 21h

程序返回

        程序结束运行后,将CPU的控制权交还给使它得以运行的程序(常为DOS系统)。

	mov ax,4c00H
	int 21h

注释

;---注释

        注释是用分号来的,怎么说呢,感觉不是很习惯,毕竟C语言的分号是结束。

编写步骤

  1. 定义一个段
  2. 实现处理任务
  3. 指出程序在何结束
  4. 段与段寄存器关联
  5. 加上程序返回的代码

编译连接

编译 

        当我们写好了汇编源程序之后,接下来就是要编译连接了,编译的话,我们是使用masm来进行编译,比如执行:masm p4-1.asm,这条指令,就会生成一个.obj 文件。

连接

        连接的话也是类似的,就是让.obj 文件变成.exe 文件,也是比较简单的。 使用:link p4-1,命令即可。

运行

        运行的话,我们分两种,第一种就是直接运行,第二种就是运用我们的debug工具去一一调试。直接运行我们不讲解,也讲解不了,我们来讲解一下我们的Debug。这里面学问也挺多的,我们慢慢来讲解。

        我们先看一下我们的程序,一共15个字节,刚好CX就是15,说明,CX里面存放的是代码的有效的字节数。 

        然后呢,DS和CS刚好相差10h,但是在物理地址里面,却是相差100H,而这100H是什么呢?答案是数据区,具体内容在操作系统会讲,在这里我们只需要简单了解一下即可。然后CS后面就是代码区。

        然后执行,我们用的是T命令,但是现在我们介绍两个命令用来执行程序:

        继续命令P(Proceed):类似T命令,逐条执行指令、显示结果。但遇子程序、中断等时,直接执行,然后显示结果。

        运行命令G(Go):从指定地址处开始运行程序,直到遇到断点或者程序正常结束。

 总结

        关于一个简单汇编程序的出生与成长和灭亡我们就介绍到这里了。

相关文章:

  • 【OpenFeign】【源码+图解】【六】创建FeignClient接口的代理(下)
  • Minecraft(我的世界) Fabric 1.19.3 服务器搭建教程
  • [ 代码审计篇 ] 代码审计案例详解(一) SQL注入代码审计案例
  • 汽车OTA概述
  • 基于Java+Swing+mysql餐厅点餐管理系统
  • 店铺如何快速实现数字化管理?不妨参考一下管理系统
  • 修改后的代码只进行了git add操作不小心给他恢复了怎么找回来
  • JUC(一):线程池
  • org.springframework.jdbc.BadSqlGrammarException: Error updating database
  • 熟人服务器被黑,五种实战方法强化linux服务器安全性!
  • RabbitMQ总结
  • 【每日一题Day67】LC1739放置盒子 | 找规律+贪心 二分查找
  • 【Linux】Linux项目自动化构建工具——make/Makefile
  • <Linux线程同步>——《Linux》
  • 【Array数组】面试前基础知识点深度记忆总结
  • 分享的文章《人生如棋》
  • (十五)java多线程之并发集合ArrayBlockingQueue
  • 《剑指offer》分解让复杂问题更简单
  • 「前端早读君006」移动开发必备:那些玩转H5的小技巧
  • 【399天】跃迁之路——程序员高效学习方法论探索系列(实验阶段156-2018.03.11)...
  • CentOS从零开始部署Nodejs项目
  • GraphQL学习过程应该是这样的
  • HTTP那些事
  • JSONP原理
  • js数组之filter
  • Linux学习笔记6-使用fdisk进行磁盘管理
  • Python学习之路13-记分
  • Redux 中间件分析
  • RxJS 实现摩斯密码(Morse) 【内附脑图】
  • Theano - 导数
  • UEditor初始化失败(实例已存在,但视图未渲染出来,单页化)
  • 阿里云ubuntu14.04 Nginx反向代理Nodejs
  • 第2章 网络文档
  • 坑!为什么View.startAnimation不起作用?
  • 时间复杂度与空间复杂度分析
  • 阿里云服务器购买完整流程
  • 国内开源镜像站点
  • #绘制圆心_R语言——绘制一个诚意满满的圆 祝你2021圆圆满满
  • (16)Reactor的测试——响应式Spring的道法术器
  • (ctrl.obj) : error LNK2038: 检测到“RuntimeLibrary”的不匹配项: 值“MDd_DynamicDebug”不匹配值“
  • (附源码)ssm智慧社区管理系统 毕业设计 101635
  • (机器学习-深度学习快速入门)第一章第一节:Python环境和数据分析
  • (免费分享)基于springboot,vue疗养中心管理系统
  • (南京观海微电子)——I3C协议介绍
  • (十一)JAVA springboot ssm b2b2c多用户商城系统源码:服务网关Zuul高级篇
  • (算法)N皇后问题
  • (一)使用Mybatis实现在student数据库中插入一个学生信息
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (转)自己动手搭建Nginx+memcache+xdebug+php运行环境绿色版 For windows版
  • (轉貼) 資訊相關科系畢業的學生,未來會是什麼樣子?(Misc)
  • .NET Core 版本不支持的问题
  • .Net MVC + EF搭建学生管理系统
  • .NET MVC 验证码
  • .NET 设计模式—适配器模式(Adapter Pattern)
  • .NET 线程 Thread 进程 Process、线程池 pool、Invoke、begininvoke、异步回调