第4章汇编语言程序格式 讲授要点 "常用伪指令与操作符。 汇编语言源程序的基本框架。 汇编语言程序的开发过程以及程序的调试方法。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 第4章汇编语言程序格式 讲授要点 ▪ 常用伪指令与操作符。 ▪ 汇编语言源程序的基本框架。 ▪ 汇编语言程序的开发过程以及程序的调试方法
4.1地址计数器 汇编器在将源程序转换为目标程序的过程中,每汇编一个段,都需要跟踪其中代码 或数据的偏移地址,这就是地址计数器。 ■地址计数器的值表示当前偏移地址。在缺省情况下,段的偏移地址从O开始。 例如,下列指令序列 0 mov bl. al 机器码为2字节 an bl Ofh ,机器码为3字节 mov 机器码为2字节 7: bh 4 机器码为3字节 A: 若该指令序列出现在段的开始,那么,在汇编相应指令时,地址计数器的值如左 侧所示。例如,第1条Moⅴ指令始于偏移地址0,由于该MOV指令是2字节,故下 条指令始于偏移地址2,等等。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 4.1 地址计数器 ▪ 汇编器在将源程序转换为目标程序的过程中,每汇编一个段,都需要跟踪其中代码 或数据的偏移地址,这就是地址计数器。 ▪ 地址计数器的值表示当前偏移地址。在缺省情况下,段的偏移地址从0开始。 例如,下列指令序列: 0: mov bl, al ; 机器码为2字节 2: and bl, 0fh ; 机器码为3字节 5: mov bh, al ; 机器码为2字节 7: shr bh, 4 ; 机器码为3字节 A: 若该指令序列出现在段的开始,那么,在汇编相应指令时,地址计数器的值如左 侧所示。例如,第1条MOV指令始于偏移地址0,由于该MOV指令是2字节,故下一 条指令始于偏移地址2,等等
4.2汇编语言语旬 1.语句格式 (1)语句的书写形式 名字助记符操作数注释 (2)MASM对语句格式的要求 ·大小写无关 ·每条语句必须占1行,但可以使用续行符"。 为了提高可读性,应该使各个域对齐。 2.常数与数值表达式 整数。包括二进制、十进制、八进制或十六进制表示的整数。 ■字符与字符串。必须用单引号或双引号括起来。 数值表达式。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 4.2 汇编语言语句 1.语句格式 (1)语句的书写形式: 名字 助记符 操作数 ; 注释 (2)MASM对语句格式的要求: • 大小写无关。 • 每条语句必须占1行,但可以使用续行符“\”。 • 为了提高可读性,应该使各个域对齐。 2.常数与数值表达式 ▪ 整数。包括二进制、十进制、八进制或十六进制表示的整数。 ▪ 字符与字符串。必须用单引号或双引号括起来。 ▪ 数值表达式
3.变量、标号与地址表达式 变量与标号的3种属性:段地址、偏移地址、类型。 变量的类型包括BYTE(字节)、WORD(字)、 DWORD(双字)等。标号的 类型包括NEAR和FAR 地址表达式。 地址表达式的基本形式为 变量名或标号名±常数 其类型由相应的变量或标号确定 ■两个地址表达式的差表示两个地址之间的距离(字节数),两个地址必须在同一 个段内。注意,不能将两个地址表达式相加。 $是一个特殊的地址表达式,表示当前地址,即地址计数器的当前值。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 3.变量、标号与地址表达式 ▪ 变量与标号的3种属性:段地址、偏移地址、类型。 ▪ 变量的类型包括BYTE(字节)、WORD(字)、DWORD(双字)等。标号的 类型包括NEAR和FAR。 ▪ 地址表达式。 地址表达式的基本形式为: 变量名或标号名 ± 常数 其类型由相应的变量或标号确定。 ▪ 两个地址表达式的差表示两个地址之间的距离(字节数),两个地址必须在同一 个段内。注意,不能将两个地址表达式相加。 ▪ $是一个特殊的地址表达式,表示当前地址,即地址计数器的当前值
4.3基本伪指令 1.处理器选择伪指令 在缺省方式下,MASM只承认8086指令 为了使用更高的CPU指令,必须使用处理器选择伪指令,主要包括 8086 .286 86P386386P 486 486P 586 586P 686 686P 分别表示其后面的代码使用相应CPU的指令。其中,结尾的P表示使用特权指令。 若使用32位CP新增指令以及寄存器或内存寻址方式,则至少要用.386伪指令。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 4.3 基本伪指令 1. 处理器选择伪指令 在缺省方式下,MASM只承认8086指令。 为了使用更高的CPU指令,必须使用处理器选择伪指令,主要包括: .8086 .286 .286P .386 .386P .486 .486P .586 .586P .686 .686P 分别表示其后面的代码使用相应CPU的指令。其中,结尾的'P'表示使用特权指令。 若使用32位CPU新增指令以及寄存器或内存寻址方式,则至少要用.386伪指令
4.3基本伪指令 2.段定义伪指令 段定义由 SEGMENT与ENDS伪指令实现,基本形式如下: 段名 SEGMENT STACK USE16 段名 ENDS 其中, STACK仅用于堆栈段。USE16指出使用16位段。 在实模式下,只能使用16位段,而32位段只能用于保护模式程序。 在实模式下,如果要使用32位指令,还必须在段定义时给出USE16。 段名作为操作数出现在指令中时,MASM将其视为立即数,表示段地址 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 4.3 基本伪指令 2. 段定义伪指令 段定义由SEGMENT与ENDS伪指令实现,基本形式如下: 段名 SEGMENT STACK USE16 段名 ENDS 其中,STACK仅用于堆栈段。USE16指出使用16位段。 在实模式下,只能使用16位段,而32位段只能用于保护模式程序。 在实模式下,如果要使用32位指令,还必须在段定义时给出USE16。 段名作为操作数出现在指令中时,MASM将其视为立即数,表示段地址
4.3基本伪指令 3.符号定义伪指令 基本形式: 符号名 EQU表达式 符号名 常数表达式 功能:给表达式指定一个等价的符号名。 说明 (1)=后的表达式只能是常数,对于字符或字符串,汇编时按整数处理。例如 COUNT 20 MOV CX, COUNT ;等价于 MOV CX,20 (2)EQU后的表达式可以是数值、字符串、寄存器名、指令助记符等。 (3)EOU不能重复定义,而=可重复定义,其作用域从定义点到重新定义之前。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 4.3 基本伪指令 3. 符号定义伪指令 基本形式: 符号名 EQU 表达式 符号名 = 常数表达式 功能:给表达式指定一个等价的符号名。 说明: (1)= 后的表达式只能是常数,对于字符或字符串,汇编时按整数处理。例如: COUNT = 20 MOV CX, COUNT ; 等价于MOV CX, 20 (2)EQU后的表达式可以是数值、字符串、寄存器名、指令助记符等。 (3)EQU不能重复定义,而 = 可重复定义,其作用域从定义点到重新定义之前
4.3基本伪指令 4.变量定义伪指令 变量定义伪指令用来为数据分配内存空间,并设置相应内存单元的初始值。 飛式 变量名变量定义符操作数,, ,操作数 其中,变量名是一个符号地址,表示其后操作数的首地址, 变量名为可选项,给出变量名只是为了按名存取其对应的内存单元。 变量定义符主要包括下列几种: ·DB( Define Byte):定义字节,后面的每个操作数占1个字节。 DW( Define Word):定义字,后面的每个操作数占1个字 DD( Define dword):定义双字,后面的每个操作数占2个字。 操作数可以是常数、用EOU或-定义的符号常量、表达式、?和DUP子句等。 其中,?表示只保留内存空间,未定义初始值。DUP子句的格式为 重复次数DUP(操作数 ,操作数) 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 4.3 基本伪指令 4. 变量定义伪指令 变量定义伪指令用来为数据分配内存空间,并设置相应内存单元的初始值。 形式: 变量名 变量定义符 操作数,,...,操作数 其中,变量名是一个符号地址,表示其后操作数的首地址, 变量名为可选项,给出变量名只是为了按名存取其对应的内存单元。 变量定义符主要包括下列几种: • DB(Define Byte):定义字节,后面的每个操作数占1个字节。 • DW(Define Word):定义字,后面的每个操作数占1个字。 • DD(Define Dword):定义双字,后面的每个操作数占2个字。 操作数可以是常数、用EQU或=定义的符号常量、表达式、?和DUP子句等。 其中,?表示只保留内存空间,未定义初始值。DUP子句的格式为: 重复次数 DUP (操作数,...,操作数)
4.3基本伪指令 说明 (1)变量可以定义在任何段(包括代码段),但一般定义在数据段。 (2)用 DW/DD/DQ/DF/D定义的数据在内存按“低字节在低地址”的方式存放。例如 DB AB 等价于S1DB4H,42H S2DWAB;等价于S2DW4142H (3)当W与DD后的操作数是地址表达式时,分别表示其16位偏移地址和32位分段地址(段 地址在高字,偏移地址在低字)。例如 DB 10DUP(?) ADDRI DW ;ADDR1的内容(字)为变量X的偏移地址 ADDR2 DD X. ADDR的高字为X的段地址,低字为X的偏移地址 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 4.3 基本伪指令 说明: (1)变量可以定义在任何段(包括代码段),但一般定义在数据段。 (2)用DW/DD/DQ/DF/DT定义的数据在内存按“低字节在低地址”的方式存放。例如: S1 DB 'AB' ; 等价于 S1 DB 41H, 42H S2 DW 'AB' ; 等价于 S2 DW 4142H (3)当DW与DD后的操作数是地址表达式时,分别表示其16位偏移地址和32位分段地址(段 地址在高字,偏移地址在低字)。例如: X DB 10 DUP (?) ADDR1 DW X ; ADDR1的内容(字)为变量X的偏移地址 ADDR2 DD X ; ADDR2的高字为X的段地址,低字为X的偏移地址
4.3基本伪指令 (4)MASM是强类型的。变量在定义后,其类型便被确定,使用时要注意类型匹配。例如 OPI DB ?, OP2 DW,2? 下列两条指令执行不同类型的操作 MOV OP1+1. 0 字节操作指令,将0作为1个字节送到地址OP1+ MOV OP2+2.0 ;字操作指令,将0作为1个字送到地址OP2+2 然而,下列两条指令是错误的 MOV OP1,AⅩ 类型不匹配 MOV OP2. AL 类型不匹配 若希望进行与变量类型不一致的操作,例如,对字变量实施字节操作,如何处理? 可以采用下面介绍的 LABEL伪指令或类型操作符PTR等。 2021//21 80x86汇编语言程序设计
2021/1/21 80x86汇编语言程序设计 4.3 基本伪指令 (4)MASM是强类型的。变量在定义后,其类型便被确定,使用时要注意类型匹配。例如: OP1 DB ?, ? OP2 DW ?, ? 下列两条指令执行不同类型的操作: MOV OP1 + 1, 0 ; 字节操作指令,将0作为1个字节送到地址OP1 + 1 MOV OP2 + 2, 0 ; 字操作指令,将0作为1个字送到地址OP2 + 2 然而,下列两条指令是错误的: MOV OP1, AX ; 类型不匹配 MOV OP2, AL ; 类型不匹配 若希望进行与变量类型不一致的操作,例如,对字变量实施字节操作,如何处理? 可以采用下面介绍的LABEL伪指令或类型操作符PTR等