汇编语言学习笔记(三)-数据结构

其实对于cpu来说,本没有什么类型之分,仅是一些内存,至于是什么,看你怎么去计算它们了,汇编是与机器码一一对应的,但是还是有些许区别,汇编毕竟还需要编译连接,为了给人使用方便,还是定义了不少数据类型(也有汇编除外,比如NASM,完全是对内存的操作)。

对AT&T汇编来说,仅仅有几种基本类型,上篇介绍编程框架时已经有所涉及:

	.ascii —— 字符串,但是无\0结尾
	.asciz —— 字符串,自动加入\0
	.byte —— 8位数据
	.double —— 双精度64位
	.float —— 单精度32位
	.int —— 整数32位
	.long —— 长整数32位
	.octa —— 16字节整数
	.quad —— 8字节整数
	.short —— 短整型16位
	.single —— 单精度,同.float

使用这些基本数据类型时,可以用标号命名,例如:

	label1: .ascii "test data\0"
	label2: .byte 12

这样便可使用label2直接引用12这块内存,当然要取12这块内存的地址应使用$label2

另外,还有一些有关符号的命令

	.equ factor, 3

这里是定义常量,定义factor为3,如果还记得上一篇的内容,如果想使用此标号,应该写为 $factor

	.comm symbol, length

这里定义在.bss段,表示在symbol处分配length长度的空间,通用符号

	.lcomm symbol, length

这里定义在.bss段,表示sysmol处将会分配有length长度的空间,不过符号只能在本文件内使用

对比MASM,数据类型要复杂的多,甚至有高级语言所谓的结构体。

先说其基本类型及其相应的简写:

	byte 8位无符号 简写db
	sbyte 8位有符号
	word 16位无符号 简写dw
	sword 16位有符号
	dword 32位无符号 简写dd
	sdword 32位有符号
	fword 48位整数
	qword 64位整数 简写dq
	tbyte 80位整数 简写dt
	read4 32位IEEE短实数
	real8 64位IEEE长实数
	real10 80位IEEE扩展精度

定义变量时格式为: [name] 指令 初始值 [,初始值 …] 例如:

	value1 byte 'A', 'b'
	value2 dd 12345678h
	value3 byte "This is a string"

其中数字后加h位16进制数字,在初始值处也可使用num dup(value)来创建num个value值。

另外MASM中定义常量也需要equ指令,但是用法却与gas语法不同:

	name equ expression
	name equ symbol
	name equ

另外还有指令 textequ,可以被重定义

另外MASM高级数据类型还有结构,结构其实是基本类型的组合,定义的基本格式如下

	name struct
	name type initial_value
	name ends

其中初始化数据定义结构成员默认值,可写?表示未定义。

在初始化结构体时,可使用<>构建初始化列表,若为空则结构初始化为定义的默认值。 例如

	; Post结构定义
	Post struct
		IdNum	byte "123456"
		Time	dw	?
		Content	byte 1024 dup('A')
	Post ends
	
	; Post对象声明
	No1	Post <>
	No2 Post 
	No3 Post 
	No4 Post 
	
	; 使用变量时与c无异
	mov Post.Time, eax

其中,结构体内仍可嵌套其他结构体,Masm32在 windows.inc 头文件中定义了Win32 API结构和函数。

还有一种高级结构为联合,语法声明为

	name union
	union-fields
	name ends

其中 union-fields 部分与结构完全相同,这里不再赘述。

这 里介绍了AT&T的MASM语法的数据类型部分,程序=数据+算法,数据类型并不很难,却是程序的一个重要组成部分。从这里可以看到AT&T数据类型十分之少,没有结构体等高级概念,当然这样定义变量时也不需要事先声明,对他来说,每个变量仅仅是一个地址,如果需要操作结构,还需我 们自己计算结构的偏移;而MASM相对方便了很多,有点类似高级语言的味道,当然语法规则也更为繁琐。

Built with Hugo
主题 StackJimmy 设计