第4章80X86汇编语言程序设计-2
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
§4.2.1 数值型参数
2、运算符
5)高低分离符:取数值的高半部分和低半部分,HIGH、LOW, 从 一 个 字 数 值 或 符 号 常 量 中 得 到 高 、 低 字 节 , 例 : mov ah,HIGH 8765H MASM 6.0引入的HIGHWORD,LOWWORD取一个符号常 量(不能是一般的常数)的高字或低字部分。 例:DD_VALUE EQU 0FFFF1234H MOV AX ,LOWWORD DD_VALUE
格式:SHORT 标号;要求:转移范围为-128~+127 功能: 设定标号为短转移标号 JMP SHORT N_JUMP
(2)TYPE操作符
格式:TYPE 名字/标号
功能:返回一个属性为字数值,表明名字或标号的类型。 表4.3 类型的返回数值 :MOVAX,TYPE 相当于操作符SIZEOF 和LENGTHOF的功能 W_VAR
3)移位运算符(SHL、SHR),Mov al,0101b shl(2*2) 4)关系运算符(EQ、NE、GT、LT、GE、LE)用于比较和 测试符号数值,MASM用FFFFH(补码-1)表示条件为真, 用0000H表示条件为假。例:mov bx,((port LT 5) AND 20)OR((PORT GE 5)AND 30)
4.2.2 变量定义伪指令
举例:
DATA DATA01 EVEN DATA02 ALIGN DATA03 ORG DATA04 DATA SEGMENT DB 1,2,3 ;完整定义段 ;DATA01 的偏移地址为0000H ;等价于ALIGN 2 ;DATA02 的偏移地址为0004H
DW 5 4 DD 6 ;DATA03 的偏移地址为0008H $+10H DB ‘ABC’ ;DATA04 的偏移地址为001CH ENDS
4.2.3 变量和标号的属性
变量、标号的属性 (1)标号指示硬指令的地址 (2)变量名指示所定义变量的开始地址 (3)段名指示相应段的起始地址 (4)子程序名指示相应子程序的起始地址 这些标号和名字一旦定义便具有3种属性: (1)段值:对应存储单元所在段的段地址
(1)等价EQU伪指令(举例说明)
格式 :符号名
符号名 (2)等号=伪指令
EQU
EQU
数值表达式
<字符串>
格式:符号名=数值表达式
§4.2.1 数值型参数
2、运算符
1、一般是由运算符连接的各种常数所构成的表达式 1)算术运算符(+、-、*、/、MOD),除加、减外其他运算 符的参数必须是整数。
2 ) 逻 辑 运 算 符 ( AND 、 OR 、 XOR 、 NOT ) , 例 : OR AL ,03H AND 45H
Leabharlann Baidu 4.3 程序段的定义和属性
1、完整段定义伪指令
完整段定义由SEGMENT和ENDS这一对伪指令实现。 伪指令格式: 段名 SEGMENT [定位] [组合] [段字] [‘类别’] ... ;语句序列 段名 ENDS 功能:SEGMENT伪指令定义一个逻辑段的开始,ENDS伪指 令表示一个段的结束。
4.2.2 变量定义伪指令
*定位伪指令: 用数据定义伪指令分配的数据是按顺序一个接一 个存放在数据段中的,但有时希望能够控制数据 的偏移地址。MASM提供了这样的伪指令。 ORG 参数
功能:将当前偏移地址指针指向参数表达式的偏移地址。 例:ORG 100h;从100H处安排数据或程序 ORG $+10;使偏移地址加10,即跳过10个字节的空间 $ 表示当前偏移地址 思考: 1、在偏移地址100H单元开始,定义“DW 1,2,$+4,$+4”,那 么在104H单元的值是多少,106H单元的值是多少? 2、ARRAY DB 12,34,56 L1 EQU $-ARRAY ;L1 的值是多少?
(2)THIS操作符 格式:THIS 类型名 功能:创建当前地址,具有指定的类型。类型名同PTR操作 符中的类型。B_VAR EQU THIS BYTE;按字节访问变量B_VA RF_JUMP EQU THIS FAR;用F_JUMP为段间转移
4.2.3 变量和标号的属性
2.类型操作符:对名字或标号的类型属性进行有关设置 (3)SHORT操作符
§4.2.1 数值型参数
1、常数
1.十进制常量:0~9数字序列,可以用字母D和d结尾,也可 没有结尾字母; 2.二进制常量:以字母B结尾的0和1组成的数字序列;
3.八进制常量:以字母O或Q结尾的0~7数字序列;
4.十六进制常量:以字母H结尾的0~9和A~F(或a~f)的 数字字母序列。 MASM提供了基数控制,.RADIX伪指令可以改变默认禁止 格式:.RADIX n 要求:n为2~16范围内任何数值 例:.RADIX 进制 16;将默认基数改为16,没有后缀的都为16
(2)偏移值:对应存储单元所在段的段内偏移地址 (3)类型:标号、子程序名的类型可以是NEAR、FAR; 变量名的类型可以是BYTE、WORD、DWORD
4.2.3 变量和标号的属性
1.地址操作符 (1)[],:,$ (2)偏移量属性OFFSET OFFSET 名字/标号
MOV AX,SEG ARRAY MOV DS, AX MOV BX,OFFSET ARRAY
4.2.2 变量定义伪指令
常用的数据定义伪指令:
例2: DATA SEGMENT COUNT MAXINT NUMBER ARRAY DATA ENDS DW EQ DW DW 8000H,?,’AB’ 64 MAXINT MAXINT DUP(0)
思考:上述语句汇编后,数据在存储器中的存放情 况?
功能:返回名字或标号的偏移地址 (3)段属性SEG SEG 名字/标号
功能:返回名字或标号的段地址
4.2.3 变量和标号的属性
2.类型操作符:对名字或标号的类型属性进行有关设置 (1)PTR操作符
格式:类型名 PTR 名字/标号 类型名可以是WORD/BYTE/DWORD/FWORD/QWORD/TBYTE MOV AL,BYTE PTR W_VAR JMP FAR PTR n_LABLE
4.2.2 变量定义伪指令
定位伪指令:
EVEN 伪指令
功能:EVEN伪指令使当前偏移地址指针指向偶地址,若原 地址指针已指向偶地址,则不作调整;否则将地址指针加1,使 地址指针偶数化。
ALIGN伪指令 指令格式 :ALIGN n
功能:将当前偏移地址指针指向n的整数倍的地址。 例如:伪指令ALIGN 4可以使下一个偏移地址开始于双字边界。
4.2.2 变量定义伪指令
MOV AX,DS MOV ES,AX 数据定义伪指令的综合应用: CLD 例4.4定义一个缓冲区,它包含33H、 MOV SI,OFFSET SOURCE 34H、35H、36H4个字符,把这四 MOV DI,OFFSET TARGET 个数据依次复制20次,存入紧接着 MOV CX,80 的存储区,最后显示出复制结果。 REP MOVSB STACK SEGMENT MOV SI,0 DW512 DUP(?) MOV BX,OFFSET TARGET STACK ENDS AGAIN:MOV DL,[BX+SI] DATA SEGMENT MOV AH,2 SOURCE DB INT 21H 33H,34H,35H,36H INC SI TARGET DB 80 DUP(?) CMP SI,80 DATA ENDS JB AGAIN CODE SEGMENT MOV AX,4C00H ASSUME INT 21H CS:CODE,DS:DATA,SS:STACK CODE ENDS START:MOV AX,DATA END START
4.2 MASM汇编语言表达式和运算符
本节学习的内容主要有语句中的名字(主要是变量名)、 标号、参数(包括操作数)部分,并引出相关的伪指令 和运算符。 §4.2.1 数值型参数 1、在汇编语言中,指令参数有数值型,它的主要形 式是常数和数值表达式。 2、指令参数还有地址型的,主要形式是标号和名字 (变量名、段名、过程名等) 。 3、硬指令的操作数有立即数、寄存器和存储单元; 其中立即数要用数值型参数表达,存储单元应该用地址 型参数(存储器操作数)表达。
4.2.2 变量定义伪指令
伪指令格式:
格式:[变量名] 伪指令 操作数[,操作数,……](初值 表) 1)变量名是用户自定义标识符,表示初值表首元素的逻 辑地址,即用这个符号表示地址。
2)初值表是用逗号分割的参数,主要由数值常数,表达 式,?(初值不确定),DUP(重复参数)组成
重复次数 DUP(重复参数)
4.2.2 变量定义伪指令
常用的数据定义伪指令:
例1: DATA SEGMENT X DB ‘a’,-5 DB 2 DUP(100),? Y DB ‘ABC’ DATA ENDS 思考:执行下列汇编指令后数据段中数据的变化 MOV AL,X DEC X+1 MOV Y,AL 思考:数据段中字节的存放情况?
§4.2.1 数值型参数
1、常数
5.字符串常量:用单引号或双引号括起来的一个或多个字符, 这些字符用它的ASCII码值存储在内存中。 例如:’d’=64h,’AB’,’Hello ,Everybaody’
6.符号常量:利用一个标识符表示一个数值,MASM中常用常 量来定义符号名。符号定义伪指令有:
4.2.2 变量定义伪指令
常用的数据定义伪指令:
DB伪指令用来定义字节,其后的每个操作数都 占有一个字节; DW伪指令用来定义字,其后的每个操作数都 占有一个字(低位字节存放在低地址,高位字 节存放在高地址); DD伪指令用来定义双字,其后的每个操作数都 占有两个字; DQ伪指令用来定义四个字,其后的每个操作数 都占有四个字; DF定义三字变量伪指令 DT定义十字节变量伪指令
4.3 程序段的定义和属性
§4.3.3 完整段定义的格式
SEGMENT ;定义堆栈段STACK ... ;分配堆栈段的大小 STACK ENDS ;堆栈段结束 DATA SEGMENT ;定义数据段DATA ... ;定义数据 DATA ENDS ;数据段结束 CODE SEGMENT‘CODE’ ;定义代码段CODE ASSUME CS:CODE,DS:DATA,SS:STACK;确定CS/DS/SS指向的逻辑段 START: MOV AX,DATA ;设置数据段的段地址DS MOV DS,AX ... ;程序代码 MOV AX,4C00H ;返回DOS INT 21H ... ;子程序代码 CODE ENDS ;代码段结束 END START ;汇编结束,程序起始位置为START STACK
§4.2.1 数值型参数
3、运算符的优先级
运算符的优先级表 表4.2
4.2.2 变量定义伪指令
变量定义伪指令可为变量申请固定长度的存储空间,并 可同时将相应的存储单元初始化。 (1)标号指示硬指令的地址 (2)变量名指示所定义变量的开始地址 (3)段名指示相应段的起始地址 (4)子程序名指示相应自程序的起始地址
4.2.2 变量定义伪指令
数据定义伪指令的综合应用:
例4.3: STACK SEGMENT DW512 DUP(?) STACK ENDS DATA SEGMENT BVAR DB 16 WVAR DW 4*3 DVAR DD 4294967295 QVAR DQ ? DB 1,2,3,4,5 TVAR DT 2345 ABC DB ‘A’,’B’,’C’ MSG DB ‘HELLO’,13,10,’$’ BBUF DB 12 DUP(‘MONTH’) DBU DD 25 DUP(?) CALLDOS EQU <INT 21H> DATA ENDS CODE SEGMENT ASSUME CS:CODE,DS:DATA,SS:STACK START:MOV AX,DATA MOV DS,AX MOV BL,BVAR MOV AX,WORD PTR DVAR[0] MOV AX,WORD PTR DVAR[2] MOV DX,OFFSET MSG MOV AH,09H CALLDOS MOV AX,4C00H CALLDOS CODE ENDS