变量类型及定义整理:太虚野老汇编中的数据类型如下表所示:一、MASM数据类型:类型描述类型缩写位数字节数数值范围字节BYTE DB 8 1 0..255有符号字节SBYTE DB 8 1 -128..127字WORD DW 16 2 0..65535有符号字SWORD DW 16 2 -32768..32767双字DWORD DD 32 4 0..4294967295有符号双字SDWORD DD 32 4 -2147483648..2147483647 远字FWORD DF 48 6四字QWORD DQ 64 8十字节TBYTE DT 80 10单精度浮点数REAL4 32 4 1.18*10-38..3.40*1038双精度浮点数REAL8 64 8 2.23*10-308..1.79*1030810字节浮点数REAL10 80 10 3.37*10-4932..1.18*104932代码清单Test5_1.asm:; Test5_1.asm.386.xmm.model flat, stdcalloption casemap:noneinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.libinclude user32.incincludelib user32.lib.datav1 dd 10 ;十进制v2 dd 10d ;十进制(Decimal)v3 dd 10t ;十进制v4 dd 10b ;二进制(Binary)v5 dd 10y ;二进制v6 dd 10q ;八进制v7 dd 10o ;八进制(Octal)v8 dd 10h ;十六进制(Hexadecimal)v9 dd 0ah ;十六进制; 如果第一位不是数字应前置0 v10 db 'hello',0 ;定义字符串.codestart:movaps xmm0, xmm7vmovaps ymm1, ymm2PrintDec v1 ;10PrintDec v2 ;10PrintDec v3 ;10PrintDec v4 ;2PrintDec v5 ;2PrintDec v6 ;8PrintDec v7 ;8PrintDec v8 ;16PrintDec v9 ;10PrintString v10 ;字符串"hello"retend start运行结果如下:代码注释:.386 ;指明指令集.xmm ;指明指令集(如果使用“vmovaps ymm1, ymm2”等指令时,需要在文件头中指定.xmm)。
.model flat,stdcall 程序工作模式,flat为Windows程序使用的模式(代码和数据使用同一个4GB段),stdcall为API调用时右边的参数先入栈option casemap:none ;指明大小写敏感代码清单Test5_2.asm:浮点数:; Test5_2.asm.386.model flat, stdcalloption casemap:noneinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.libinclude user32.incincludelib user32.lib.datav1 real8 3.14v2 real8 3.v3 real8 3.14E2.codestart:PrintDouble v1 ;3.14PrintDouble v2 ;3PrintDouble v3 ;314retend start运行结果如下:代码清单Test5_3.asm:常量、可赋初值的变量、不赋初值的变量:; Test5_3.asm.386.model flat, stdcalloption casemap:noneinclude windows.incinclude kernel32.incinclude masm32.incinclude debug.incincludelib kernel32.libincludelib masm32.libincludelib debug.libinclude user32.incincludelib user32.lib.const ;常量v1 dd 11.data ;可赋初值的变量, 其中也可声明不不赋初值的变量 v2 dd 22v3 dd ?.data? ;不赋初值的变量v4 dd ?.codestart:PrintDec v1 ;11PrintDec v2 ;22PrintDec v3 ;0PrintDec v4 ;0mov eax, 33mov v3, eaxmov eax, 44mov v4, eaxPrintDec v1 ;11PrintDec v2 ;22PrintDec v3 ;33PrintDec v4 ;44retend start运行结果如下:mmword(64位,但只能用于MMX指令集中),xmmword(128位,用于MMX、SSE 指令集),ymmword(256位,用于最新的A VX指令集)。
二、NASM数据类型:1.nasm 定义的8 种数据size●byte:8 位●word :16位●dword :32位●qword :64位●tword:80 位●oword :128位●yword :256位●zword :512位tword, oword 以及yword 使用在非整型数据,使用在float和SSE 型数据。
2.定义初始化数据:db 家族nasm 定义了用于初始化上面8 种size 的db家族,它们用于定义初化常量值。
类型描述类型缩写位数字节数数值范围字节BYTE DB 8 1 0..255字WORD DW 16 2 0..65535双字DWORD DD 32 4 0..4294967295四字QWORD DQ 64 8下面是NASM Manual 上的例子:db 0x55 ; just the byte0x55db 0x55,0x56,0x57 ; three bytes in successiondb 'a',0x55 ; character constants are OKdb 'hello',13,10,'$' ; so are string constantsdw 0x1234 ; 0x340x12dw 'a' ; 0x610x00 (it's just a number)dw 'ab' ; 0x610x62 (character constant)dw 'abc' ; 0x610x620x630x00 (string)dd 0x12345678 ; 0x780x560x340x12dd 1.234567e20 ; floating-point constantdq 0x123456789abcdef0 ; eight byte constantdq 1.234567e20 ; double-precision floatdt 1.234567e20 ; extended-precision float3.定义非初始化数据:resb 家族程序中使用到的非初始化数据通常放在bss section里,bss 代表uninitialized storage spacenasm 使用了resb(reserve byte)家族来定义非初始化数据。
●resb:reserve byte●resw :reserve word●resd :reserve doubword●resq:reserve quadword●rest:reserve tword●reso:reserve oword●resy:reserve ywordresb 相当于Microsoft MASM 语法中的db ?下面是NASM Manual 的例子:buffer: resb 64 ; reserve 64 byteswordvar: resw 1 ; reserve a wordrealarray resq 10 ; array of ten realsymmval: resy 1 ; one YMM register4.浮点数常量浮点数变量可以使用DB , DW , DD , DQ , DT以及DO,浮点数常量使用__float8__ , __float16__ , __float32__ , __float64__ , __float80m__ , __float80e__ , __float128l__以及__float128h__来定义。
下面是nasm 提供的例子:db -0.2 ; "Quarter precision"dw -0.5 ; IEEE 754r/SSE5 half precisiondd 1.2 ; an easy onedd 1.222_222_222 ; underscores are permitteddd 0x1p+2 ; 1.0x2^2 = 4.0dq 0x1p+32 ; 1.0x2^32 = 4294967296.0dq 1.e10 ; 10000000000.0dq 1.e+10 ; synonymous with 1.e10dq 1.e-10 ; 0.0000000001dt 3.141592653589793238462 ; pido1.e+4000 ; IEEE 754r quad precisionNASM中的浮点数定义:类型描述缩写位数字节数数值范围四分之一精度浮点数DB 8 1半精度浮点数DW 16 2单精度浮点数DD 32 4 1.18*10-38..3.40*1038双精度浮点数DQ 64 8 2.23*10-308..1.79*10308扩展双精度浮点数DT 80 10 3.37*10-4932..1.18*104932四精度浮点数(128位)DO 128 16256位浮点数DY 256 32512位浮点数DZ 512 64正如前面所说的:dt , do , dy , dz不接受整型数值常量,它们被使用在定义float 或SSE 数据常量。