微机原理与汇编 伪指令
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
图2:
(3)用字符串定义变量 字符串必须用单引号引起来,其中字符的个数可 以是一个,也可以是多个。注意空格也是字符 (ASCII码为20H)。 【例4】 STRING1 DB '123' STRING2 DB 'HOW ARE YOU? ' STRING3 DW 'C' , 'DE' 变量STRING1, STRING2, STRING3经汇编后的 结果如图3。
在用ASSUME语句来完成段的分配时,要注意以下几点: ① 在一个代码段中,如果没有另外的ASSUME语句重新设置,则原有 的ASSUME语句的设置一直有效。 ② 每条ASSUME语句可设置1-6个段寄存器。
③ 可以使用NOTHING将以前的设置删除, 例如: ASSUME ES: NOTHING ; 删除对ES与某段的关联设置 ASSUME NOTHING ; 删除对全部6个段寄存器的设置 ④ 段寄存器的装入。
【例6】 T1 DB 3 DUP(0) T2 DW 2 DUP(?) T3 DB 3 DUP(1, 2 DUP(50H)) 变量T1, T2, T3经汇编后的结果如图5所示。
图5:
【例1】
DATA XX YY ZZ DATA EXTRA RSS1 RSS2 RSS3 EXTRA STACK SEGMENT ; 定义数据段 DB ? DB ? DB ENDS SEGMENT ; 定义附加段 DW ? DW ? DD ? ENDS SEGMENT ; 定义堆栈段 DW 50 DUP( ) TOP EQU THIS WORD STACK ENDS CODE SEGMENT ; 定义代码段 ASSUME CS: CODE, DS: DATA ASSUME ES: EXTRA, SS: STACK START: MOV AX, DATA MOV DS, AX MOV AX, EXTRA MOV ES, AX MOV AX, STACK MOV SS, AX MOV SP, OFFSET TOP …… CODE ENDS END START
图4:
格式2的说明:
与 格 式 1 的 不 同 之 处 在 于 格 式 2 增 加 了 n DUP (duplicate)用于表示重复次数,同时表达式需用圆 括号括起。其中,重复次数n可以是常数,也可以是表 达式,它的值应该是一个正整数,数值范围为1~65 535,其作用是指定括号中操作数项的重复次数。括号 中的操作数项可以有多项,但项与项之间也必须用逗号 分隔开来。这种格式适用于定义许多相同的变量。
格式: ASSUME 段寄存器: 段名[, 段寄存器: 段名, …]
功能:说明源程序中定义的段由哪个段寄存器去寻址。段寄 存器可以是CS, SS, DS, ES, FS或GS。 说明:格式中,ASSUME是伪指令名,是语句中 的关键 字,不可省略。段寄存器名后面必须有冒号,如果分配的 段名不止一个,则应用逗号分开。段名是指用 SEGMENT/ENDS伪指令语句定义过的段名。ASSUME 伪指令设置在代码段内(只能设置在代码段内),放在段 定义语句之后。
例1解析:
在例1中,用SEGMENT和ENDS分别定义了四 个段:数据段、附加段、堆栈段和代码段。 在数据段和附加段中分别定义了一些数据, 在堆栈段中定义了50个字单元的堆栈空间。 段分配伪指令ASSUME指明CS寄存器指向代 码(CODE)段,DS指向数据(DATA)段, ES指向附加(EXTRA)段,SS指向堆栈 (STACK)段,如果一行写不下,可分为两 个ASSUME语句来说明。
任何一个逻辑段从SEGMENT语句开始,以ENDS语句结束。伪指令名 SEGMENT和ENDS是本语句的关键字,不可以默认,并且必须成对出现。 语句中段名是必选项,定位类型、组合类型、字长类型、类别为可选项。 用户自己选定,不能省略,其规定同变量或标号,一个段开始与结尾用 的段名应一致。
2.段分配伪指令 ASSUME
格式1又可分ຫໍສະໝຸດ Baidu以下几种具体用法 :
(1)用数值表达式定义变量 【例2】 K1 DB 10, 4, 10H K2 DW 100, 100H, -5 K3 DD 3*20, 0FFFDH 变量K1, K2, K3经汇编后的结果如图1所示。
图1:
(2)用地址表达式定义变量 【例3】 RS1 DW ADDR1 DW ADDR2 RS2 DD LOOP1 DD LOOP2 汇编程序在汇编时,在相应存储区域中存入有关 变量或标号的地址值,其中偏移地址或段基址均 占一个字,低位字节占用第一个字节地址,高位 字节占用第二个字节地址。若用DD定义变量或标 号,则偏移地址占用低位字,段基址占用高位字。 变量RS1, RS2经汇编后的结果如图2所示。
2. 变量定义伪指令
变量定义伪指令用来定义变量的类型,并为变 量中的数据项分配存储单元。变量定义伪指令 有两种不同的格式。 格式1 格式:[变量名] DB/DW/DD/DQ/DT 表达式 格式2
格式1. [变量名] DB/DW/DD/DQ/DT 表达式功能: DB(define byte):定义一个字节类型的变量,其后的每个操作数 均占用1个字节。 DW(define word):定义一个字类型的变量,其后的每个操作数均 占用1个字(2个字节)。 DD(define doubleword):定义一个双字类型的变量,其后的每个 操作数均占用2个字(4个字节)。 DQ(define quadword):定义一个四字类型的变量,其后的每个 操作数均占用4个字(8个字节)。 DT(define ten bytes):定义一个十字节类型的变量,其后的每个 操作数均占用5个字(10个字节)。 其中,各变量定义伪指令都将高位字节数据存放在高地址中,低位字 节数据存放在低地址中。
注:对字符串的定义可用DB伪指令,也可用DW伪指令。用DW和DB定 义的变量在存储单元中存放的格式是不同的。用DW语句定义的字符串 只允许包含一个或两个字符,如果字符多于两个时,必须用DB语句来 定义。
图3:
(4)用问号(?)定义不确定值的变量 可为变量保留空单元,常用来存放运算的 结果。 【例5】 OPER1 DB 35H, ?, 0AH OPER2 DW 0C0DH, ? OPER3 DD ? 变量OPER1, OPER2, OPER3经汇编后 的结果如图4所示。
1、段定义伪指令 2、变量定义伪指令
1. 段定义伪指令
段定义伪指令指示汇编程序如何按段组织 程序和使用存储器。 段定义伪指令主要有: SEGMENT/ENDS ASSUME ORG
1.段定义伪指令 SEGMENT/ENDS 格式:
段名SEGMENT [定位类型][, 组合类型][, 字长类型][, 类别] …… ( 段体 ) …… 段名 ENDS
段分配伪指令用来完成段的分配,说明当前哪些 逻辑段被分别定义为代码段、数据段、堆栈段和 附加段。 1、代码段用来存放被执行的程序; 2、数据段用来存放程序执行中需要的数据和运 算结果; 3、当用户程序中使用的数据量很大或使用了串 操作指令时,可设置附加段来增加数据段的容量; 4、堆栈段用来设置堆栈。