8086CPU汇编语言程序格式_8086汇编 精简教程-程序员宅基地

技术标签: 汇编  8086CPU汇编  

提示:主要内容来源 ===> 汇编语言基础教程(主编:谈文蓉、副主编:姜玥)教材第八章的内容


汇编语言程序格式

  • 高级语言程序员编程时,用户无需考虑存储空间的分配,因为操作系统和软件编译器帮助用户解决了这些问题。
  • 对于低级语言程序员而言,存储空间对用户不再是透明的。但是指令无法实现对存储空间的分配,而这个工作由伪指令来完成。

一、汇编语言的语句格式

  • 汇编语言对大小写不敏感。
  • 汇编源程序的语句主要包括两类:指令(硬指令)和伪指令。
    • 硬指令是在程序运行期间由 CPU 执行的,汇编后由对应的机器代码所取代。
    • 伪指令是不可执行的,它只是在源程序汇编期间由汇编程序处理的命令,它既不控制机器的操作,也不被汇编成机器代码,只为汇编程序所识别并指导汇编如何进行,相对于程序或寄存器的地址载入。

1.说明性语句

  • 伪指令构成,通常指示汇编程序如何汇编源程序
  • 格式:名字 伪指令助记符 参数, 参数… ;注释
  • 其中,名字可以是变量名、子程序名等,既反映逻辑地址,又具有自身的各种属性。

2.可执行语句

  • 硬指令构成的语句,通常对应一条机器指令,出现在程序中的代码段中。
  • 格式:标号:硬指令助记符 操作数, 操作数 … ;注释
  • 其中标号反应该指令的逻辑地址,为控制转移类指令 提供转移的目的地址。

3.注意

  • 标号和名字是符合汇编语法的用户自定义的标识符,每个标识符的定义是唯一的。
  • 标识符一般最多由31个字母、数字及规定的特殊符号($、?等)组成,不能以数字开头。标识符不能是汇编语言的保留字。
  • 汇编语言的保留字主要有硬指令或伪指令助记符、运算符、寄存器名等。

二、DEBUG 和 MASM 环境对指令的不同处理

1.参数

(1)整数
  • DEBUG 把键入的数字均看成十六进制,因此在 DEBUG 环境下,键入十六进制数不能加 H;如要键入十进制数,则后面应加以说明,如 100D。DEBUG 环境下对其他的所有进制不识别。
  • MASM 默认键入的数是十进制,如要键入其他进制的数需要在后面加上说明,如 100H,01001101B。
(2)字符与字符串
  • 字符和字符串必须使用单引号或双引号括起来。
  • 单个字符相当于整数,值为 ASCII码;字符串一般用于 DB 伪指令后。
  • 注意:
    • DEBUG 里不能识别单引号,所以 DEBUG 里输入字符,只能输入字符的 ASCII 码;
    • MASM 里输入字符,既可以直接输入单引号引起来的字符,也可以输入字符的ASCII 码,两者是等效的。
(3)数值表达式
  • 数值表达式一般由运算符连接的各种常数所构成的表达式。汇编程序在汇编过程中计算表达式,最终得到一个数值。

2.变量与标号

(1)变量定义伪指令
  • 变量定义伪指令为变量分配存储空间,并设置相应存储单元的初始值。
  • 格式:[变量名] 变量定义符 操作数[, …, 操作数 ]
  • 其中变量名是用户自定义符,表示其后操作数的首地址,用这个符号表示地址,常称为符号地址;变量名可以没有,汇编程序将直接为初值表分配空间,无符号地址。
  • 变量定义符:
    • DB:定义字节,每个操作数占一个字节;
    • DW:定义字,每个操作数占一个字。
  • 操作数可以是常数、表达式、“?”、“DUP”等。
    • “?” 表示未赋初值,只保留内存空间。
    • “DUP” 定义重复初值。
      • 格式:重复次数 DUP (操作数, … , 操作数)
  • 注意:
    • 定义一个 ASCII 字符或字符串一般使用 DB 伪指令,对存储单元的分配有特殊要求时,也可以使用 DW 伪指令。
    • 带符号数以补码形式存放。
    • DEBUG 里不能使用变量,MASM 里才能使用变量。
(2)变量与标号的属性
  • 标号和变量名具有两类属性:

    • 地址属性:标号和名字对应存储单元的逻辑地址,包括段地址和偏移地址。
    • 类型属性:标号、子程序名的类型可以是 NEAR 和 FAR,分别表示段内和段间;变量名的类型可以是 BYTE 和 WORD 等。
      • NEAR 属性只能被相同代码段的其他程序调用,为段内近调用。
      • FAR 属性可以被相同或不同代码段的程序调用,为段间远调用。
  • 说明:

    • DEBUG 里使用变量或标号的地址。
    • MASM 里直接使用变量名或标号。
  • 地址操作符:取得名字或标号的段地址和偏移地址,汇编时由 MASM 自动会计算。

    • OFFSET 变量名/标号 ;返回名字或标号的偏移地址
    • SEG 变量名/标号 ;返回名字或标号的段地址
    • LEA 指令和 OFFSET 伪指令的比较:
      • 格式上,LEA 指令可以使用各种存储器的寻址方式,OFFSET 只能用于变量和标号
      • 对简单变量,OFFSET 比 LEA 执行速度快。
      • OFFSET 在 DOS 的输入/输出类功能调用里经常用到。
  • 类型操作符:对名字和标号的类型属性进行有关设置。

    • 格式:类型名 PTR 内存操作数/标号 ;类型名为 BYTE、WORD等,或者是 NEAR、FAR。
  • 其他操作符:

    • TYPE 名字/标号;返回一个常数,表示名字/标号的类型。对于 BYTE 和 WORD 类型,分别返回 1 和 2.
    • LENGTHOF 名字/标号;返回直接分配给指定变量的元素个数。
    • SIZEOF 名字/标号;返回直接分配给指定变量的字节数
    • SIZEOF 名字/标号 = TYPE 名字/标号 * LENGTHOF 名字/标号

三、符号定义伪指令

  • 在程序设计中,可能会多次使用同一个表达式,为了减少重复书写的麻烦,汇编语言提供了 “EQU”、“=” 伪指令。
  • 伪指令 EQU
    • 格式:符号名 EQU 表达式 ;用符号名代表表达式的值。
    • 说明:表达式可以是任何有效的格式,如常数、数值表达式等,甚至是为指令定义另一个名称。但是 EQU 定义的符号名在同一个程序中只能定义一次。
  • 伪指令 =
    • 符号名 = 表达式 ;用符号名代表表达式或表达式的值。
    • 说明:伪指令 = 与 EQU功能相似,它们的区别是 = 定义的符号在同一个程序中可重新定义。

四、过程

  • 当一段程序需要在一个或多个程序的多处被使用时,为了简化程序设计,通常将这段程序抽取出来,定义为过程。过程是功能相对独立的一段程序,又叫子程序。

1.过程定义

  • 过程定义由 PROC 和 PEND 伪指令实现:格式如下
    过程名 PROC [NEAR/FAR]
    过程体
    过程名 ENDP
  • 过程名在整个程序中必须是唯一的。 属性默认为 NEAR。
  • 一般情况下,[NEAR/FAR] 别省略,根据过程定义伪指令,汇编程序自动确定段内还是段间调用。

2.过程调用与返回

  • 过程调用与返回由 CALL 和 RET 指令功能完成。
  • 过程调用时 CALL指令将其下一条指令(返回地址) 进栈,然后将控制转移到过程,从过程的第一条指令开始执行。当执行到 RET 指令时,弹出栈顶内容作为返回地址,使得控制转移到 CALL指令的下一条指令,继续执行。
  • CALL LABEL ;段内调用, SP<-SP-2, [SS]:SP<-IP, IP=LABEL 偏移地址
  • CALL 指令和 JMP 指令的区别:返回地址压入堆栈。CALL是调用跳转,在执行到RET 指令后,会返回到 CALL 后继续执行;JMP 则是无条件跳转,是不会跳回的。
  • RET; 段内返回,IP<-SS:[SP], SP<-SP+2

3.代码示例

	PROC1 PROC   ;过程属性默认为 NEAR
		PUSH AX    ;保护 AX, DX
		PUSH DX

		MOV DL, 0DH  ;回车的 ASCII 码为 0DH
		MOV AH, 2H
		INT 21H
		MOV DL, 0AH  ;换行的 ASCII 码为 0AH
		INT 21H

		POP DX   ;恢复 AX, DX
		POP AX
		RET	;子程序返回
	PROC1 ENDP	;子程序结束

五、汇编语言源程序

1.汇编语言源程序结构

  • 一个汇编源程序可以包含若干个代码段、数据段、附加段或堆栈段,段与段之间的顺序可以随意排列。
  • 需独立运行的程序必须包含一个代码段。
  • 对于一般程序来说,定义太多的段只会增加程序设计的复杂,通常只需要一个代码段、数据段和堆栈段。

2.代码模板

.model small  ;这条语句必须位于所以段定义语句之前,定义程序的存储模型(一般采用small,表示小型模型,一个程序最多只能有一个代码段和一个数据段)。
	.stack  ;定义堆栈段,后面可以设置大小,默认是1KB。
	.data   ;定义数据段,@data表示.data等定义的段地址。
		;  ....这里定义数据
	.code     ;定义代码段,后面可以设置段名。
	.startup;程序的起始点,并建立DS、SS内容。
		; ....这里写程序代码
		CALL PROC1
		CALL PROC1
		CALL PROC1
	.exit 0   ; == mov AH, 4CH   Int 21H == JMP '$',程序终止伪指令,产生“终止程序执行返回操作系统”的代码,通常用参数 0 表示没有错误。
	; ....这里写过程代码
	PROC1 PROC   ;过程属性默认为 NEAR
		PUSH AX    ;保护 AX, DX
		PUSH DX

		MOV DL, 0DH  ;回车的 ASCII 码为 0DH
		MOV AH, 2H
		INT 21H
		MOV DL, 0AH  ;换行的 ASCII 码为 0AH
		INT 21H

		POP DX   ;恢复 AX, DX
		POP AX
		RET	;子程序返回
	PROC1 ENDP	;子程序结束
end ;汇编结束伪指令指示汇编程序 MASM 到此结束汇编过程。
    


;.startup 伪指令产生程序开始执行的代码,同时指定程序开始执行的起始点。在 DOS 下,该语句还将初始化 DS,调整 SS 和 SP值。
; 在 SMALL 下,对应 8086CPU,.startup 将被汇编成如下启动代码:
;	MOV DX, DSEG ;DSEG 表示数据段的段地址
;	MOV DS, DX   ;设置 DS
;	MOV BX, SS   

;以下部分代码:计算 SS 和 DS 之间的偏移量(SS-DS)并将其左移 4 位(乘以16)是为了将这个偏移量应用到堆栈指针SP上,从而正确设置堆栈。
;8086处理器中的堆栈指针SP是相对于堆栈段SS的偏移量。这段代码中的操作,通过计算SS和DS之间的差值并将其乘以16,实际上是在调整堆栈指针SP的位置,使得堆栈指针在堆栈段SS中正确地指向与数据段DS相关的位置。这样可以确保程序在使用堆栈时不会发生地址越界或错误的情况
;	SUB BX, DX
;	SHL BX, 1
;	SHL BX, 1
;	SHL BX, 1
;	SHL BX, 1

;	CLI          ;关中断
;	MOV SS, DX   ;调整 SS=DS,这是 small 模型的规定
;	ADD SP, BX   ;调整 SP
;	STI          ;开中断

六、汇编语言源程序的开发

1.开发环境

  • MASM 是微软公司开发的汇编开发环境,是 Windos 下开发汇编的利器。
  • 使用 MASM 的开发人员必须在 Windos 下进行开发。
  • MASM6X中的常用文件:
    • ML.EXE :汇编器
    • LINK.EXE:连接器
    • CV.EXE:调试器 CodeView

2.开发过程

  • (1)编辑:需要用文本编辑器建立扩展名为 .asm 的源程序文件
  • (2)汇编:用汇编程序对源程序(.asm)进行汇编,生成目标文件(.obj)
  • (3)连接:用连接程序将一个或多个目标文件以及库文件(.lib)连接成一个可以执行的文件(.exe)
  • (4)运行调试:用调试器执行生成的可执行文件(.exe)
  • 注意:必须将源程序保存在与 MASM/bin 文件里面的文件同级的目录下(即 bin 目录下) 才可以进行编译、连接、调试 。
(1)源文件的汇编
  • 在 DOS 状态下,进入汇编程序(ML.EXE)所在的目录:
    • 32 位操作系统下,通过 CD 命令进入
    • 64 位操作系统下,在当前的 D 盘符下即可运行 ML.EXE
  • 输入下列命令和参数:ml/c test.asm
(2)目标文件的连接
  • 在 DOS 状态下,进入连接程序所在的目录:
    • 32 位操作系统下,通过 CD 命令进入
    • 64 位操作系统下,在当前的 D 盘符下即可运行 ML.EXE
  • 输入下列命令:link test.obj
(3)注意
  • ml 可以自动调用 LINK,实现汇编和连接依次进行,其命令格式:ml test.asm

3.可执行文件的调试与运行

(1)CodeView 中的窗口
  • Source
    • 用来显示源程序和对应的机器代码
  • Memory
    • 用来显示或修改存储单元的值
  • Reg
    • 用来显示或修改寄存器的值
  • Command
    -用来输入调试命令(同 DEBUG 命令)
(2)CodeView中的菜单
  • RUN 菜单
    • Animate ---- 程序运行。激活程序开始一步一步执行,程序运行到 .exit 0 伪指令对应的指令(MOV AH, 04CH INT 21H)处将自动停止。
    • Restart ----- 程序恢复到被调试程序未执行前的初始状态,光标回到可执行代码的第一行(程序起始点)
(3)其他
  • 用鼠标对准源代码双击,可以设置端点,再双击取消断点。

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_65032328/article/details/135240257

智能推荐

Docker安装:Errors during downloading metadata for repository ‘appstream‘:_"cenerrors during download metadata for repository-程序员宅基地

文章浏览阅读1k次。centos8问题参考CentOS 8 EOL如何切换源? - 云服务器 ECS - 阿里云_"cenerrors during download metadata for repository \"appstream"

尚硅谷_谷粒学苑-微服务+全栈在线教育实战项目之旅_基于微服务的在线教育平台尚硅谷-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏11次。SpringBoot+Maven+MabatisPlusmaven在新建springboot项目引入RELEASE版本出错maven在新建springboot项目引入RELEASE版本出错maven详解maven就是通过pom.xml中的配置,就能够从仓库获取到想要的jar包。仓库分为:本地仓库、第三方仓库(私服)、中央仓库springframework.boot:spring-boot-starter-parent:2.2.1.RELEASE’ not found若出现jar包下载不了只有两_基于微服务的在线教育平台尚硅谷

java 实现 数据库备份_java数据备份-程序员宅基地

文章浏览阅读1k次。数据库备份的方法第一种:使用mysqldump结合exec函数进行数据库备份操作。第二种:使用php+mysql+header函数进行数据库备份和下载操作。下面 java 实现数据库备份的方法就是第一种首先我们得知道一些mysqldump的数据库备份语句备份一个数据库格式:mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 ..._java数据备份

window10_ffmpeg调试环境搭建-编译64位_win10如何使用mingw64编译ffmpeg-程序员宅基地

文章浏览阅读3.4k次,点赞2次,收藏14次。window10_ffmpeg调试环境搭建_win10如何使用mingw64编译ffmpeg

《考试脑科学》_考试脑科学pdf百度网盘下载-程序员宅基地

文章浏览阅读6.3k次,点赞9次,收藏14次。给大家推荐《考试脑科学》这本书。作者介绍:池谷裕二,日本东京大学药学系研究科教授,脑科学研究者。1970年生于日本静冈县,1998年取得日本东京大学药学博士学位,2002年起担任美国哥伦比亚大学客座研究员。专业为神经科学与药理学,研究领域为人脑海马体与大脑皮质层的可塑性。现为东京大学药学研究所教授,同时担任日本脑信息通信融合研究中心研究主任,日本药理学会学术评议员、ERATO人脑与AI融合项目负责人。2008年获得日本文部大臣表彰青年科学家奖,2013年获得日本学士院学术奖励奖。这本书作者用非常通俗易懂_考试脑科学pdf百度网盘下载

今天给大家介绍一下华为智选手机与华为手机的区别_华为智选手机和华为手机的区别-程序员宅基地

文章浏览阅读1.4k次。其中,成都鼎桥通信技术有限公司是一家专业从事移动通讯终端产品研发和生产的高科技企业,其发布的TD Tech M40也是华为智选手机系列中的重要代表之一。华为智选手机是由华为品牌方与其他公司合作推出的手机产品,虽然其机身上没有“华为”标识,但是其品质和技术水平都是由华为来保证的。总之,华为智选手机是由华为品牌方和其他公司合作推出的手机产品,虽然外观上没有“华为”标识,但其品质和技术水平都是由华为来保证的。华为智选手机采用了多种处理器品牌,以满足不同用户的需求,同时也可以享受到华为全国联保的服务。_华为智选手机和华为手机的区别

随便推点

Linux常用命令_ls-lmore-程序员宅基地

文章浏览阅读4.8k次,点赞17次,收藏51次。Linux的命令有几百个,对程序员来说,常用的并不多,考虑各位是初学者,先学习本章节前15个命令就可以了,其它的命令以后用到的时候再学习。1、开机 物理机服务器,按下电源开关,就像windows开机一样。 在VMware中点击“开启此虚拟机”。2、登录 启动完成后,输入用户名和密码,一般情况下,不要用root用户..._ls-lmore

MySQL基础命令_mysql -u user-程序员宅基地

文章浏览阅读4.1k次。1.登录MYSQL系统命令打开DOS命令框shengfen,以管理员的身份运行命令1:mysql -u usernae -p password命令2:mysql -u username -p password -h 需要连接的mysql主机名(localhost本地主机名)或是mysql的ip地址(默认为:127.0.0.1)-P 端口号(默认:3306端口)使用其中任意一个就OK,输入命令后DOS命令框得到mysql>就说明已经进入了mysql系统2. 查看mysql当中的._mysql -u user

LVS+Keepalived使用总结_this is the redundant configuration for lvs + keep-程序员宅基地

文章浏览阅读484次。一、lvs简介和推荐阅读的资料二、lvs和keepalived的安装三、LVS VS/DR模式搭建四、LVS VS/TUN模式搭建五、LVS VS/NAT模式搭建六、keepalived多种real server健康检测实例七、lvs持久性工作原理和配置八、lvs数据监控九、lvs+keepalived故障排除一、LVS简介和推荐阅读的资料 学习LVS+Keepalived必须阅读的三个文档。1、 《Keepalived权威指南》下载见http://..._this is the redundant configuration for lvs + keepalived server itself

Android面试官,面试时总喜欢挖基础坑,整理了26道面试题牢固你基础!(3)-程序员宅基地

文章浏览阅读795次,点赞20次,收藏15次。AIDL是使用bind机制来工作。java原生参数Stringparcelablelist & map 元素 需要支持AIDL其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。下图是我进阶学习所积累的历年腾讯、头条、阿里、美团、字节跳动等公司2019-2021年的高频面试题,博主还把这些技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

机器学习-数学基础02补充_李孟_新浪博客-程序员宅基地

文章浏览阅读248次。承接:数据基础02

短沟道效应 & 窄宽度效应 short channel effects & narrow width effects-程序员宅基地

文章浏览阅读2.8w次,点赞14次,收藏88次。文章目录1. 概念:Narrow Width Effect: 窄宽度效应Short Channel effects:短沟道效应阈值电压 (Threshold voltage)2. 阈值电压与沟道长和沟道宽的关系:Narrow channel 窄沟的分析Short channel 短沟的分析1. 概念:Narrow Width Effect: 窄宽度效应在CMOS器件工艺中,器件的阈值电压Vth 随着沟道宽度的变窄而增大,即窄宽度效应;目前,由于浅沟道隔离工艺的应用,器件的阈值电压 Vth 随着沟道宽度_短沟道效应