资源描述
第7章 高级汇编语言程序设计
7.1. 结构
7.1.1 结构的定义
格式:
结构名 STRUC
…
字段名 DB/DW/DD … ;字段定义
…
结构名 ENDS
*结构定义是一种对存储形式的描述,并不真正分配存储空间,只是定义了一种新的数据类型,类似定义了一个类(面向对象技术的思考方法)。类是结构的进化。
例:定义一个学生成绩结构
STUDENT STRUC
NUM1 DB ? ;学号
NAME1 DB ‘ABCDEFGHIJ’ ;姓名
SEX1 DB ? ;性别
MATH1 DB ?
COMPU1 DB ?
ADDRESS1 DB 20 DUP(?) ;地址
STUDENT ENDS
7.1.2 结构变量的定义
格式:
变量名 结构名 <字段初值表>
变量名 结构名 n DUP (<字段初值表>)
*定义了变量后才分配了存储空间,变量类似面对象技术中的一个实例。
例:
S1 STUDENT < >
S2 STUDENT <02, ‘Lisi’, ‘W’, 100, 70, ‘Shanghai’>
S3 STUDENT <02, ‘Li’, ‘M’>
S3 STUDENT 30 DUP(< >) ;定义了含有30个学生元素的结构数组。
7.1.3 结构变量及字段的访问
访问格式:
变量名.字段名
[地址寄存器].字段名
例1:
MOV AL,S2.SEX1
MOV AL, S2[11]
MOV BX, OFFSET S2 ; LEA BX,S2
MOV AL, [BX].SEX1
例2:自己看。
7.2. 记录
记录与结构相似,差别在于结构用于定义以字节为基本单位的信息,而记录用于定义以二进制为基本单位的信息。
C中的struct
7.2.1 记录的定义
格式:
记录名 RECORD 字段名:<宽度>[=<表达式>][, …]
*所有字段宽度之和不能大于16,宽度大于8按16处理。
例:
STUF RECORD NO:8, SEX:1 , MARRIAGE:1, WORK:5, HELTH:1
7.2.2 记录变量的定义及初始化
格式:
变量名 记录名<字段值表>
例:
PP1 STUF <00000001B, 1B, 0B, 01011B, 0B>
7.2.3 记录的运算
(1) 记录或记录字段宽度运算符WIDTH
MOV AX, WIDTH STUF
MOV DL, WIDTH SEX
(2) 记录屏蔽运算符MASK
返回8位或16位,只对应记录段名为1,其它位为0.
MOV AX, MASK SEX
7.2.4 对记录及字段的访问
用MASK
7.3. 宏汇编
7.3.1 宏定义
C中的 inline
格式:
(1)带参宏定义
宏指令名 MACRO 形参1,形参2,……
宏体
ENDM
(2)无参宏定义
宏指令名 MACRO
宏体
ENDM
例:
PRINT MACRO buf1
LEA DX,buf1
MOV AH,9
INT 21H
ENDM
7.3.2 宏调用
格式:
宏指令名 [实参1,实参2,……]
例如:对上面的宏定义的三种调用形式为:
┆
PRINT BUF1
┆
PRINT BUF2
┆
PRINT BUF3
┆
7.7 汇编语言与C连接
Xxxasm.asm--àxxxasm.obj
xxxc.c --àxxxc.obj
link obj文件 生成exe文件。
两种连接方法:C中插入asm(直接插入法); C调用asm.(模块连接法)
#include <stdlib.h>
extern int maxx(int ,int );
int main(int argc, char *argv[]){
int x;
{
_asm mov ah,1
_asm int 21h
}
x= maxx(8,9);
printf("%d",x);
{ _asm mov ah,1
_asm int 21h
}
x= maxx(10,7);
printf("%d",x);
{
_asm mov ah,1
_asm int 21h
}
return 1;
}
.MODEL LARGE
.CODE
public _maxx
_maxx proc far
push bp
mov bp,sp
mov ax,[bp+6]
cmp ax,[bp+8]
jge exit
mov ax,[bp+8]
exit:pop bp
ret
_maxx endp
end
展开阅读全文