汇编变量类型及定义
- 格式:pdf
- 大小:384.29 KB
- 文档页数:12
新版汇编语言程序设计变量定义及常用伪指令汇编语言是计算机底层的编程语言,具有高效、灵活的特点。
在进行汇编语言程序设计时,变量定义和常用伪指令是不可或缺的重要部分。
本文将详细介绍新版汇编语言程序设计中的变量定义和常用伪指令,并提供相应的示例和应用。
一、变量定义在汇编语言中,变量定义是用来存储数据的标识符和内存分配的过程。
变量可以是不同的数据类型,如整型、字符型、字符串型等。
变量定义的格式如下所示:变量名数据类型初始值其中,变量名是标识符,用来表示变量的名称;数据类型是变量的类型,包括BYTE、WORD、DWORD等;初始值是可选项,用来给变量赋初值。
下面是一个变量定义的示例:count DWORD 10这个例子定义了一个名为count的DWORD类型变量,初始值为10。
二、常用伪指令1. EQUEQU是汇编语言中常用的伪指令,用于给标识符赋值。
其格式如下:标识符 EQU 表达式其中,标识符是需要赋值的标识符,表达式是赋给标识符的值。
下面是一个EQU指令的示例:MAX_SIZE EQU 100这个例子给标识符MAX_SIZE赋值为100。
2. DB、DW、DDDB、DW和DD是用来定义字节、字和双字变量的伪指令。
它们分别代表Byte(字节)、Word(字)和Double Word(双字)。
其格式如下:标识符 DB/ DW/ DD 初始值下面是一个DB指令的示例:message DB "Hello, World!"这个例子定义了一个名为message的字节型变量,并给它赋值为"Hello, World!"。
3. RESB、RESW、RESDRESB、RESW和RESD是用来声明未初始化的字节、字和双字变量的伪指令。
其格式如下:标识符 RESB/ RESW/ RESD 数量其中,标识符是需要声明的变量名,数量是变量的个数。
下面是一个RESW指令的示例:numbers RESW 5这个例子声明了一个名为numbers的字型数组,包含5个元素。
C语⾔中变量的声明和定义变量声明和变量定义变量定义:⽤于为变量分配存储空间,还可为变量指定初始值。
程序中,变量有且仅有⼀个定义。
变量声明:⽤于向程序表明变量的类型和名字。
定义也是声明,extern声明不是定义定义也是声明:当定义变量时我们声明了它的类型和名字。
extern声明不是定义:通过使⽤extern关键字声明变量名⽽不定义它。
[注意]变量在使⽤前就要被定义或者声明。
在⼀个程序中,变量只能定义⼀次,却可以声明多次。
定义分配存储空间,⽽声明不会。
C++程序通常由许多⽂件组成,为了让多个⽂件访问相同的变量,C++区分了声明和定义。
变量的定义(definition)⽤于为变量分配存储空间,还可以为变量指定初始值。
在程序中,变量有且仅有⼀个定义。
声明(declaration)⽤于向程序表明变量的类型和名字。
定义也是声明:当定义变量的时候我们声明了它的类型和名字。
可以通过使⽤extern声明变量名⽽不定义它。
不定义变量的声明包括对象名、对象类型和对象类型前的关键字extern。
extern声明不是定义,也不分配存储空间。
事实上它只是说明变量定义在程序的其他地⽅。
程序中变量可以声明多次,但只能定义⼀次。
只有当声明也是定义时,声明才可以有初始化式,因为只有定义才分配存储空间。
初始化式必须要有存储空间来进⾏初始化。
如果声明有初始化式,那么它可被当作是定义,即使声明标记为extern。
任何在多⽂件中使⽤的变量都需要有与定义分离的声明。
在这种情况下,⼀个⽂件含有变量的定义,使⽤该变量的其他⽂件则包含该变量的声明(⽽不是定义)。
如何清晰的区分变量声明和定义extern通知编译器变量在其他地⽅被定义1.extern告诉编译器变量在其他地⽅定义了。
例如:extern int i;//声明,不是定义int i;//声明,也是定义,未初始化带有初始化式的声明必定式定义2.如果声明有初始化式,就被当作定义,即使前⾯加了extern。
1.变量的定义从前面的章节可以看出,程序中所有的东西几乎都有名字。
然而字面量却是个例外,它没有名字。
那么使用变量,我们就可以为某个值取名字了。
实际上,我们是为系统内存中用于保存数据的某块空间取名字。
ANSI C规定:变量必须“先定义、后使用”,因此当用C定义变量时,不仅需要指定变量名,而且还必须告诉编译器其存储的数据类型,变量类型告诉编译器应该在内存中为变量名分配多大的存储单元,用来存放相应变量的值(变量值),而变量仅仅是存储单元的别名,供变量使用的最小存储单元是字节(Byte)。
由此可见,每个变量都占据一个特定的位置,每个存储单元的位置都由“地址”唯一确定并引用,就像一条街道上的房子由它们的门牌号码标识一样。
即从变量中取值就是通过变量名找到相应的存储地址,然后读取该存储单元中的值,而写一个变量就是将变量的值存放到与之相应的存储地址中去。
由于变量的定义不是可执行代码,因此要求局部变量的定义必须位于用“{}包围的程序块”的开头,即在可执行代码的前面。
比如:int lower_limit = 80; //定义lower_limit为整型变量即在定义lower_limit为int类型数据时,系统就已经为变量lower_limit分配了存储单元。
请注意区分变量名和变量值这两个不同的概念,其中,lower_limit为变量名,80为变量lower_limit的值,即存放在变量lower_limit的存储单元中的数据。
那么到底如何获得变量的地址呢?C语言使用“&(地址运算符)加变量名”的方式获取变量的地址,比如,&lower_limit就代表变量lower_limit的地址,详见后续相关章节的描述。
一个定义只能指定一种变量类型,虽然后面所带的变量表可以包含一个或多个该类型的变量:int lower_limit , upper_limit , sum;但如果将一个定义语句中的多个变量拆开在多个定义语句中定义的话:int lower_limit; // lower_limit为数据下限int upper_limit;// upper_limit为数据上限int sum;// sum为求和的结果则可在各个定义语句中添加注释,则大大提高了程序的可阅读性,而且修改起来更加方便,但C编译器会忽略在每行右边用于描述变量用途的注释语句。
汇编语言汇编语言实质上是机器语言的符号表示,即用助记符(指令功能的英文缩写)代替了机器语言指令的二进制代码。
用汇编语言按着规定的语法规则编写的程序称为汇编语言源程序(*.asm)。
汇编语言源程序中的汇编指令与指令的机器码(目标代码)是一一对应的。
汇编语言2高级语言是面向过程的语言,它不依赖于特定的机器,独立于机器,高级语言编写的程序由一系列编程语句和相应的语法规则构成,编程方法更适合于人们的思维习惯,易于理解和阅读,程序本身具有可移植性,通用性强高级语言的缺点是编译程序和解释程序复杂,占用内存空间大,与汇编语言程序相比,经编译后产生的目标程序长,执行速度慢高级语言3汇编语言上机处理过程4汇编语言汇编语言的程序格式伪指令程序设计基本方法5汇编语言的程序格式汇编语言程序的结构汇编语言语句类型及格式汇编语言的数据与表达式6源程序的一般格式STACK SEGMENT┇STACK ENDSDATA SEGMENT┇DATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATA,SS:STACKSTART:…┇CODE ENDSEND START7例题一个两字相加的程序。
DATA SEGMENT ;定义数据段DATA1 DW 1234H ;定义被加数DATA2 DW 5678H ;定义加数DATA ENDS ;数据段结束ESEG SEGMENT ;定义附加段SUM DW 2 DUP(?);定义存放结果区ESEG ENDS ;附加段结束CODE SEGMENT ;定义代码段;下面的语句说明程序中定义的各段分别用哪个段寄存器寻址ASSUME CS:CODE, DS:DATA,ES:ESEGSTART:MOV AX,DSEG ;START为程序开始执行的启动标号MOV DS,AX ;初始化DSMOV AX,ESEGMOV ES,AX ;初始化ESLEA SI,SUM ;存放结果的偏移地址送SIMOV AX,DATA1 ;取被加数ADD AX,DATA2 ;两数相加MOV ES:[SI],AX ;和送附加段的SUM单元中HLTCODE ENDS ;代码段结束END START ;源程序结束8源程序的结构特点汇编语言程序通常由若干段组成,段由伪指令SEGMENT与ENDS定义,各段顺序任意,段的数目按需要确定,原则上不受限制。
汇编语言和汇编程序汇编语言和汇编程序一、回答下列问题1、何谓汇编语言程序?何谓汇编程序?简述汇编程序的功能。
2、什么叫做变量?变量有哪几种属性?程序中如何放问变量?3、什么叫做标号?标号有哪几种属性?4、8088汇编语言中有哪几类运算符?5、什么叫做表达式?它的运算规则是什么?6、8088/8086汇编语言程序中段的类型有哪几种?段定义中定位类型、组合类型和类别名各有什么作用?7、设VALA EQU 200VALB EQU 30VALC EQU 1BH下列表达式的值各为多少?(1)(VALA*VALC+VALB)/VALC(2)(VALA MOD VALC-VALB/VALC(3)(VALB AND 0FH)OR (VALB XOR 0FH)(4)(VALA GE VALB )AND 0FH8、根据下列数据定义,各条指令单独运行后,AX的内容是什么?TABLEA DW 10 DUP(?)TABLEB DB 10 DUP(?)TABLEC DB ‘1234’TABLED DW 1,2,3,4(1)MOV AX,TYPE TABLEA(2)MOV AX,TYPE TABLEB(3)MOV AX,TYPE TABLEC(4)MOV AX,TYPE TABLED(5)MOV AX,LENGTH TABLEA(6)MOV AX,LENGTH TABLEB(7)MOV AX,LENGTH TABLEC(8)MOV AX,LENGTH TABLED(9)MOV AX,SIZE TABLEA(10)MOV AX,SIZE TABLEB(11)MOV AX,SIZE TABLEC(12)MOV AX,SIZE TABLED9、执行下列指令后,AX寄存器的内容是什么?TABLE DW 0,100,200,300,400DISTA DW 6(1)MOV BX,OFFSET TABLEADD BX,DISTAMOV AX,[BX](2)LEA BX,TABLEMOV AX,2[BX](1)MOV SI,4MOV BX,OFFSET TABLEMOV AX,[BX][SI](2)MOV BX,DISTAMOV AX,TABLE[BX]10、画图说明下列语句分配存储空间及初始化的数据值。
第三章宏汇编语言每种计算机语言都规定了自己的字符、基本词汇、典型语句和语法规则。
同样,汇编语言也有自己的字符、基本词汇、典型语句和语法规则。
字符:ASCII字符基本词汇:符号指令(MOV、ADD)伪指令(DB、SEGMENT等)典型语句:●机器指令语句——对应机器指令的一种操作。
●伪指令语句——无机器语言与之对应,不生成机器指令。
●宏指令语句——一条宏指令对应多条机器指令,产生一组目标代码。
语法规则:基本语法单位(常量、变量、标号、表达式)前面的例子已介绍了源程序的基本结构、格式、名字的定义、语句格式,下面将更深入地介绍有关语法规则。
3.1表达式汇编程序的语句及程序格式都比较固定,语句中除正确选择操作符之外,主要问题在于正确表示操作数地址,这涉及到寻址方式,可以归结到地址表达式的使用。
表达式:由常数、寄存器、标号、变量加上运算符构成的式子。
3.1.1.常量与数值表达式一.常量常量:从源程序翻译成目标程序期间已经有确定数值的量。
用途:赋值、作立即数、位移量。
由常量与运算符组成的式子。
数值表达式在汇编期间进行运算,结果为常量。
汇编期间允许对常量进行3种运算:1.算术运算包括:+、–、*、/、模除(MOD,取余数)、右移、左移。
2.逻辑运算●逻辑乘:AND(与)●逻辑加:OR(或)●按位加:XOR(异或)●逻辑非:NOT(非)3.关系运算包括:相等(EQ)、不等(NE)、小于(L T)、大于(GT)、小于等于(LE)、大于等于(GE)。
运算结果:关系不成立,结果为0;关系成立,结果为–1(0FFFFH)。
如:N = 50M = (N EQ 50)该关系成立,M =–1。
3.1.2.变量、标号与地址表达式一.变量变量:数据存贮单元的名字。
(存放地址的符号表示)。
变量有三个属性:段、EA、类型。
其中类型由定义时的伪指令确定(DB、DW、DD、DT)。
变量的定义:格式:[变量名] 数据定义伪指令表达式[,…]数据定义伪指令:DB、DW、DD、DQ、DT等。
变量类型及定义整理:太虚野老汇编中的数据类型如下表所示:一、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 数据常量。