当前位置:文档之家› 微机原理与汇编 伪指令

微机原理与汇编 伪指令


图2:
(3)用字符串定义变量 字符串必须用单引号引起来,其中字符的个数可 以是一个,也可以是多个。注意空格也是字符 (ASCII码为20H)。 【例4】 STRING1 DB '123' STRING2 DB 'HOW ARE YOU? ' STRING3 DW 'C' , 'DE' 变量STRING1, STRING2, STRING3经汇编后的 结果如图3。
图4:
格式2的说明:
与 格 式 1 的 不 同 之 处 在 于 格 式 2 增 加 了 n DUP (duplicate)用于表示重复次数,同时表达式需用圆 括号括起。其中,重复次数n可以是常数,也可以是表 达式,它的值应该是一个正整数,数值范围为1~65 535,其作用是指定括号中操作数项的重复次数。括号 中的操作数项可以有多项,但项与项之间也必须用逗号 分隔开来。这种格式适用于定义许多相同的变量。
Hale Waihona Puke 例1解析:在例1中,用SEGMENT和ENDS分别定义了四 个段:数据段、附加段、堆栈段和代码段。 在数据段和附加段中分别定义了一些数据, 在堆栈段中定义了50个字单元的堆栈空间。 段分配伪指令ASSUME指明CS寄存器指向代 码(CODE)段,DS指向数据(DATA)段, ES指向附加(EXTRA)段,SS指向堆栈 (STACK)段,如果一行写不下,可分为两 个ASSUME语句来说明。
任何一个逻辑段从SEGMENT语句开始,以ENDS语句结束。伪指令名 SEGMENT和ENDS是本语句的关键字,不可以默认,并且必须成对出现。 语句中段名是必选项,定位类型、组合类型、字长类型、类别为可选项。 用户自己选定,不能省略,其规定同变量或标号,一个段开始与结尾用 的段名应一致。
2.段分配伪指令 ASSUME
在用ASSUME语句来完成段的分配时,要注意以下几点: ① 在一个代码段中,如果没有另外的ASSUME语句重新设置,则原有 的ASSUME语句的设置一直有效。 ② 每条ASSUME语句可设置1-6个段寄存器。
③ 可以使用NOTHING将以前的设置删除, 例如: ASSUME ES: NOTHING ; 删除对ES与某段的关联设置 ASSUME NOTHING ; 删除对全部6个段寄存器的设置 ④ 段寄存器的装入。
段分配伪指令用来完成段的分配,说明当前哪些 逻辑段被分别定义为代码段、数据段、堆栈段和 附加段。 1、代码段用来存放被执行的程序; 2、数据段用来存放程序执行中需要的数据和运 算结果; 3、当用户程序中使用的数据量很大或使用了串 操作指令时,可设置附加段来增加数据段的容量; 4、堆栈段用来设置堆栈。
格式1又可分为以下几种具体用法 :
(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所示。
格式: ASSUME 段寄存器: 段名[, 段寄存器: 段名, …]
功能:说明源程序中定义的段由哪个段寄存器去寻址。段寄 存器可以是CS, SS, DS, ES, FS或GS。 说明:格式中,ASSUME是伪指令名,是语句中 的关键 字,不可省略。段寄存器名后面必须有冒号,如果分配的 段名不止一个,则应用逗号分开。段名是指用 SEGMENT/ENDS伪指令语句定义过的段名。ASSUME 伪指令设置在代码段内(只能设置在代码段内),放在段 定义语句之后。
【例6】 T1 DB 3 DUP(0) T2 DW 2 DUP(?) T3 DB 3 DUP(1, 2 DUP(50H)) 变量T1, T2, T3经汇编后的结果如图5所示。
图5:
注:对字符串的定义可用DB伪指令,也可用DW伪指令。用DW和DB定 义的变量在存储单元中存放的格式是不同的。用DW语句定义的字符串 只允许包含一个或两个字符,如果字符多于两个时,必须用DB语句来 定义。
图3:
(4)用问号(?)定义不确定值的变量 可为变量保留空单元,常用来存放运算的 结果。 【例5】 OPER1 DB 35H, ?, 0AH OPER2 DW 0C0DH, ? OPER3 DD ? 变量OPER1, OPER2, OPER3经汇编后 的结果如图4所示。
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个字节)。 其中,各变量定义伪指令都将高位字节数据存放在高地址中,低位字 节数据存放在低地址中。
【例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
1、段定义伪指令 2、变量定义伪指令
1. 段定义伪指令
段定义伪指令指示汇编程序如何按段组织 程序和使用存储器。 段定义伪指令主要有: SEGMENT/ENDS ASSUME ORG
1.段定义伪指令 SEGMENT/ENDS 格式:
段名SEGMENT [定位类型][, 组合类型][, 字长类型][, 类别] …… ( 段体 ) …… 段名 ENDS
相关主题