IA-32中常见的伪指令
伪指令知识点总结

伪指令知识点总结伪指令这玩意儿,听起来是不是有点玄乎?其实啊,它就像我们生活中的“幕后英雄”,虽然不直接参与“表演”,但却起着至关重要的作用。
比如说,在编程的大舞台上,指令就像是冲锋陷阵的战士,执行着各种具体的任务。
而伪指令呢,则像是军师,在幕后出谋划策,为整个程序的架构和布局提供指导。
咱先来说说数据定义伪指令。
这就好比是在为程序的“仓库”划分区域,规定好每个区域存放什么样的“货物”。
比如说,定义一个字节类型的数据,就像是给仓库里划出一个小格子,只能放一个小小的“物件”;定义一个字类型的数据呢,那就是一个稍微大一点的格子,可以放个稍微大一点的“宝贝”。
你说这是不是很形象?再看看段定义伪指令。
这就像是给程序的“大部队”划分阵营。
不同的阵营有不同的任务和职责。
比如说,代码段就是专门负责执行具体操作的“战斗部队”;数据段呢,则是存放各种“粮草弹药”的地方。
如果没有段定义伪指令,那程序岂不是乱成了一锅粥?还有过程定义伪指令,这就像是给程序中的一个小任务成立了一个“特别行动小组”。
这个小组有自己的规则和流程,能独立完成特定的功能。
宏定义伪指令呢?这就好比是给程序制作了一个“快捷方式”。
当你需要重复执行一段复杂的操作时,不用一次次地重复写那些代码,只要调用这个“快捷方式”就行了,多省事啊!伪指令的作用可不仅仅是这些,它还能控制程序的编译过程,就像是一个精明的“导演”,掌控着整个程序的“拍摄进度”和“效果呈现”。
总之,伪指令在编程中可是不可或缺的存在。
要是没有它们,程序就像是失去了方向的船只,在茫茫的代码海洋中迷失。
所以啊,咱们可得好好掌握这些伪指令的知识,让我们的程序能够高效、准确地运行,为我们解决各种复杂的问题。
你说是不是这个理儿?。
《计算机系统基础》模拟试卷及答案

《计算机系统基础》模拟试卷及答案一、单项选择题(共20题,40分)1、—个完整的计算机系统包括硬件和软件。
软件又分为()A、操作系统和语言处理程序B、系统软件和应用软件C、操作系统和髙级语言D、低级语言程序和高级语言程序2、假设同一套指令集用不同的方法设计了两种计算机A和B。
机器A的时钟周期为1.2ns ,机器B的时钟周期为2ns。
某个程序在机器A上运行时的CPI为2,在B上的CPI为1,则对于该程序来说,机器A和机器B之间的速度关系为()。
A、机器A比机器B快1.2倍B、机器B比机器A快1.2倍C、机器A的速度是机器B的1.2倍D、机器B的速度是机器A的1.2倍3、以下有关指令集体系结构的说法中,错误的是()A、指令集体系结构位于计算机软件和硬件的交界面上B、指令集体系结构是指低级语言程序员所看到的概念结构和功能特性C、程序员可见寄存器的长度、功能与编号不属于指令集体系结构的内容D、指令集体系结构的英文缩写是ISA4、以下有关冯•诺依曼计算机结构的叙述中,错误的是()。
A、计算机由运算器、控制器、存储器和输入/输岀设备组成B、程序由指令和数据构成,存放在存储器中C、指令由操作码和地址码两部分组成D、指令按地址访问,所有数据在指令中直接给出5、假定变量i、f的数据类型分别是int、float。
已知i=12345,f=1.2345e3,则在一个32位机器中执行下列表达式时,结果为“假”的是()。
A、i==(int)(float)iB、i==(int)(double)iC、f==(float)(int)fD、f==(float)(double)f6、在一般的计算机系统中,西文字符编码普遍采用()。
A、BCD码B、ASCII码C、格雷码D、CRC码7、“北”的区位码是1717,那么,其机内码是()。
A、B1B1HB、1717HC、9797HD、3737H8、CPU中能进行算术和逻辑运算的最基本运算部件是()。
3 IA-32指令系统

(3)MOVSX传送并符号扩展。 此指令的格式为: MOVSX DOPD,SOPD 其中,目标操作数DOPD是寄存器操作数(某一
通用寄存器)。源操作数SOPD可以是寄存器或内存
操作数,源操作数可以是字节或字。此指令是把一字 节源操作数按符号扩展为字或双字传送至目标寄存器
中;或把字操作数按符号扩展为双字传送至目标寄存
第3章 IA-32指令系统
3.1 基本数据类型 3.2 IA-32的指令格式 3.3 IA-32指令的操作数寻址方式
3.4 IA-32的通用指令
退出
3.1 基本数据类型
IA-32结构的基本数据类型是字节、
字、双字、四字和双四字,如图3-1所示。
一个字节是8位,一个字是两个字节(16位),双 字是4字节(32位),四字是8字节(64位),双四字 是16字节(128位)。 3.1.1 字、双字、四字和双四字的对齐 字、双字和四字在内存中并不需要对齐至自然边 界(字、双字和四字的自然边界是偶数编号的地址, 对于双字和四字来说,地址要分别能被4和8整除)。 然而,为改进程序的性能,数据结构(特别是堆 栈)只要可能应对齐在自然边界上。这样做的理由是: 对于不对齐的存储访问,处理器要求做两次存储访问 操作;而对于对齐的访问只要做一次存储访问操作。
2.减法指令 (1)SUB指令 此指令的格式为: SUB DOPD,SOPD 这条指令完成两个操作数相减,也即从DOPD中 减去SOPD,结果放在DOPD中。具体地说,可以从累 加器中减去立即数;或从寄存器或内存操作数中减去 立即数;或从寄存器中减去寄存器或内存操作数;或 从寄存器或内存操作数中减去寄存器操作数等。 (2)SBB(Subtract with Borrow)指令此指令的 格式为: SBB DOPD,SOPD 这条指令与SUB指令类似,只是在两个操作数相 减时,还要减去借位标志CF的现行值。
完整版汇编语言中常用的伪指令档

完整版汇编语言中常用的伪指令档汇编语言是一种低级的程序设计语言,它用于编写底层计算机程序。
在汇编语言中,伪指令是一类特殊的指令,它们在程序运行时不会被计算机执行,而是在编译或汇编时被处理器或汇编器解释和展开。
伪指令在汇编语言中起到辅助编程、优化代码和声明常量等作用。
本文将介绍完整版汇编语言中常用的伪指令档。
一、伪指令的定义和作用伪指令是汇编语言中的一类特殊指令,它们不是真正的指令,不会被计算机执行,而是在编译或汇编的过程中被汇编器或处理器解释和处理。
伪指令主要用于辅助编程、优化代码和声明常量等作用。
伪指令的格式一般与真正的指令相似,但一般不包含操作码。
在一些汇编语言中,伪指令以特殊的标记或符号来区分,比如以“.”开头的指令。
二、常用的伪指令档1. ORG指令ORG指令用于指定程序的起始地址。
在汇编程序中,使用ORG指令可以将程序的代码段或数据段放置在指定的内存地址处。
其格式一般为:ORG 地址其中,地址为16进制数或表示内存单元的符号。
2. EQU指令EQU指令用于定义符号常量或符号变量。
它将一个符号与一个数值或地址进行关联,使得在程序中使用该符号时可以被汇编器或处理器替换为对应的数值或地址。
其格式一般为:符号 EQU 数值或地址其中,符号为一个标识符,数值或地址可以是16进制数、10进制数或表示内存单元的符号。
3. DB指令DB指令用于定义字节型数据。
它可以用于声明字符、整数等字节型数据,并将这些数据存储在指定的内存地址中。
其格式一般为:标号 DB 表达式其中,表达式可以是一个字节常量、字符常量或表示内存单元的符号。
4. DW指令DW指令用于定义字型数据。
它可以用于声明无符号整数等字型数据,并将这些数据存储在指定的内存地址中。
其格式一般为:标号 DW 表达式其中,表达式可以是一个字常量或表示内存单元的符号。
5. DD指令DD指令用于定义双字型数据。
它可以用于声明无符号双字整数等双字型数据,并将这些数据存储在指定的内存地址中。
微机原理(第8讲)第4章-IA-32指令系统4.2

4.2 数据传送类指令
4.2.1 数据传送指令
1. 传送指令 MOV
2. 交换指令 XCHG
3. 换码指令 XLAT
1. 进栈/出栈指令 PUSH / POP 2. 堆栈的应用
4.2.2 堆栈操作指令
4.2.3 地址传送指令 LEA
4.2.1 数据传送指令
作用
实现下列数据传送功能
例1.分析指令运行结果
(a) LEA
AX,[2728H]
;AX=2728H ;BX=BP+SI的值
(b) LEA
xchg
dl, dh
xchg
al, [edi]
例3.
XCHG
AX,[SI+400H]
执行后,5678H被送到内存单元, AX=1234H
低地址
AH AL AX 56 78 12 34
SI+400H 78 34 56 12
高地址
3. 换码指令 XLAT
完成一个字节的查表转换,又称:查表转换指令
将CX的内容压入堆栈,然后,弹出栈顶至CX中 已知:(SS)=0200H,(SP)=0008H,(CX)=12FAH
SS SP CX 12FAH 0200 0008
×16
+
-2
2000
SS段 首地址
2006 2007 2008
FA 12
新栈顶
原栈顶
(a)入栈示意图 PUSH CX
SS
SP CX
源操作数DEST和目的操作数SRC类型(长度)必须一
功能
微机原理 第13章 IA-32结构微处理器的结构与工作方式

�
13.2.7 任务切换 13.
任何多用户/ 任何多用户 / 多任务操作系统的一个非常重要的 属性, 属性 , 就是它在各任务或各过程之间有快速切换的能 微处理器通过硬件支持, 力.IA-32微处理器通过硬件支持,提供任务切换指令 微处理器通过硬件支持 直接支持这种操作. 直接支持这种操作.
13.3 虚拟 虚拟8086方式 方式
第13章 13章
IA-32微处理器的工作方式 IA-32微处理器的工作方式
IA-32微处理器有两种主要的工作方式:实地址 微处理器有两种主要的工作方式: 微处理器有两种主要的工作方式 方式和保护虚地址方式. 方式和保护虚地址方式.
13.1 13.2 13.3
实地址方式 保护虚地址方式 虚拟8086 8086方式 虚拟8086方式
13.2.3 描述符 13.
在保护虚地址方式下的每一个段, 在保护虚地址方式下的每一个段 , 都有一个相应 的描述符.描述符由8个字节组成 个字节组成, 的描述符.描述符由 个字节组成,包含了此段的基地 段的大小( 位 址 ( 32位) , 段的大小 ( 20位) , 段的类型等一些主 位 要特性. 要特性. 微处理器中, 在IA-32微处理器中,主要有两种类型描述符: 微处理器中 主要有两种类型描述符: 代段码和数据段描述符; 代段码和数据段描述符; 特种数据段和控制描述符. 特种数据段和控制描述符. 在后一种里又分为特种数据段描述符和控制( 在后一种里又分为特种数据段描述符和控制 ( 门 ) 描述符两大类. 描述符两大类.
微处理器芯片中增加了一种虚拟8086方式. 方式. 在IA-32微处理器芯片中增加了一种虚拟 微处理器芯片中增加了一种虚拟 方式 这是在保护虚地址方式下的一种方式, 这是在保护虚地址方式下的一种方式,即IA-32微处理 微处理 器总体上是工作在保护虚地址方式,支持多用户, 器总体上是工作在保护虚地址方式 , 支持多用户 , 多 任务操作系统的运行,而在多任务的环境中, 任务操作系统的运行 , 而在多任务的环境中 , 有的任 务可以工作在虚拟8086方式. 也即在一个多用户 , 多 方式. 务可以工作在虚拟 方式 也即在一个多用户, 任务的操作系统(பைடு நூலகம்例如UNIX系统) 中,其主体是工 系统) 任务的操作系统( 例如 系统 作在IA-32微处理器的保护虚地址方式,可以做到有的 微处理器的保护虚地址方式, 作在 微处理器的保护虚地址方式 任务运行于32位的保护方式 运行UNIX支持下的软件; 位的保护方式, 支持下的软件; 任务运行于 位的保护方式,运行 支持下的软件 有的任务运行在80286的应用软件;也有的任务运行在 的应用软件; 有的任务运行在 的应用软件 虚拟8086方式,执行DOS的应用软件. 虚拟 方式,执行 的应用软件. 方式 的应用软件
第3章 IA-32微处理器指令系统简介
普通高等教育“十一五”国家级规划教材
微机原理
(第四版)
3.1.3 寻址方式
MOV AX,[BX] 设DS=6000H,BX=3000H,则本指令在执行时,将63000H和 63001H两单元的内容送AX。 ④ 间接寻址时,若有效地址存放在BP中,则默认的段寄存器为SS,因 为BP称为基址寄存器,所以这种寻址方式通常称为堆栈段基址寻址。例 如: MOV BX,[BP] 设SS=7000H,BP=1000H,则该指令在执行时,将71000H和 71001H两单元的内容送BX。 ⑤ SI和DI寄存器分别称为源变址寄存器和目的变址寄存器,所以用这两 个寄存器来进行间接寻址也叫变址寻址。
普通高等教育“十一五”国家级规划教材
微机原理
(第四版)
3.1.3 寻址方式
(8)带有比例因子的变址寻址 在这种格式中,存储单元的有效地址采用如下形式: 存储单元的有效地址=比例因子*变址寄存器的内容+位移量 在指令格式中,将段寄存器考虑进去时,完整的地址表达式如下: 段寄存器:[比例因子ⅹ变址寄存器+位移量] 或者 段寄存器:位移量[比例因子ⅹ变址寄存器] 需要注意的是,访问约定的逻辑段,段超越前缀可以省略。其中比 例因子可以是1,2,4,8中的1个数,这是因为操作数的长度可以是1、 2、4、8个字节;变址寄存器可以EBP是或者EAX~EDX,ESI和EDI寄存 器。例如: MOV AX,X[BX*2][SI]
普通高等教育“十一五”国家级规划教材
微机原理
(第四版)
3.1.2 指令格式
(2)单操作数指令格式为: [标号:]操作符 目的操作数 相应的操作规定为: ① 操作对象为目的地址中的操作数,操作结束后,其运算结果送入目的 地址中。 ② 操作数不能是立即数。
微机原理(第9讲)第4章-IA-32指令系统4.3
无符号数加法:溢出? 有溢出 有符号数加法:溢出? 无溢出
例2.
若:DS=2000H,BX=1200H, (2226BH)=90H,(2226CH)=30H 执行 ADD [BX+106BH],1234H 结果:(________H )=_______H 2226B 42C4 (________H )=____H, (________H )=____H C4 2226B 42 2226C
存放在THIRD单元中
MOV AX,FIRST
SUB AX,SECOND
MOV THIRD,AX
MOV AX,FIRST + 2
SBB AX,SECOND + 2
MOV THIRD + 2,AX
例3. 与SUB指令相结合实现多精度数的减法
mov ax,01eeh ;AX=01EEH
mov dx,9469h ;DX=9469H
SF=
1 0 1 0 1 0 结果为负 否则
ZF=
1 0
结果为0 否则
CF=
被减数的最高有效位有向高位的借位
否则
OF=
两个操作数符号相反,而结果的符号与减数相同
否则
CF=1表示无符号数减法溢出 OF=1表示带符号数减法溢出
3. 减量指令 DEC
该指令经常用于修改地址指针寄存器 (BX,BP,SI,DI) 使之指向上一个单元
SF=0 ZF=0
0100 0011 0011 0110
+1111 1110 1100 1010 1 0100 0010 0000 0000
CF=0 AF=0
IA-32控制转移指令
IA-32常用指令类型(4)控制转移指令指令执行可按顺序或跳转到转移目标指令处执行–无条件转移指令JMP DST:无条件转移到目标指令DST处执行–条件转移Jcc DST:cc为条件码,根据标志(条件码)判断是否满足条件,若满足,则转移到目标指令DST处执行,否则按顺序执行–条件设置SETcc DST:按条件码cc判断的结果保存到DST(是一个8位寄存器)–调用和返回指令(用于过程调用)CALL DST:返回地址RA入栈,转DST处执行RET:从栈中取出返回地址RA,转到RA处执行–中断指令(详见第7、8章)IA-32的标志寄存器•6个条件标志–OF、SF、ZF、CF 各是什么标志(条件码)?–AF:辅助进位标志(BCD码运算时才有意义)–PF:奇偶标志•3个控制标志–DF(Direction Flag):方向标志(自动变址方向是增还是减)–IF(Interrupt Flag):中断允许标志(仅对外部可屏蔽中断有用)–TF(Trap Flag):陷阱标志(是否是单步跟踪状态)•……808680286/386回顾:整数减法举例-7-6 = -7 + (-6) = +3 -3 -5 = -3 + (-5) = -89 -6 = 3 13 -5 = 811++0001111111011110101111可利用条件标志进行大小判断X √做减法以比较大小,规则:Unsigned: CF=0时,大于Signed:OF=SF时,大于OF=0、ZF=0、SF=1、借位CF=0OF=1、ZF=0SF=0、借位CF=0√√验证:9>6,故CF=0;13>5,故CF=0验证:-7<6,故OF≠SF-3<5,故OF≠SF条件转移指令分三类:(1)根据单个标志的值转移(2)按无符号整数比较转移(3)按带符号整数比较转移例子:程序的机器级表示与执行int sum(int a[ ], unsigned len) {int i,sum = 0;for (i = 0; i <= len–1; i++) sum += a[i]; return sum;}当参数len为0时,返回值应该是0,但是在机器上执行时,却发生了存储器访问异常。
IA-32传送指令
IA-32常用指令类型(1)传送指令–通用数据传送指令MOV:一般传送,包括mov b、mov w和mov l等MOVS:符号扩展传送,如mov sbw、mov swl等MOVZ:零扩展传送,如mov zwl、mov zbl等XCHG:数据交换PUSH/POP:入栈/出栈,如push l,push w,pop l,pop w等–地址传送指令LEA:加载有效地址,如lea l(%edx,%eax), %eax”的功能为R[eax]←R[edx]+R[eax],执行前,若R[edx]=i,R[eax]=j,则指令执行后,R[eax]=i+j–输入输出指令IN和OUT:I/O端口与寄存器之间的交换–标志传送指令PUSHF、POPF:将EFLAG压栈,或将栈顶内容送EFLAG栈底新栈顶栈底栈顶•栈(Stack)是一种采用“先进后出”方式进行访问的一块存储区,用于嵌套过程调用。
从高地址向低地址增长•“栈”不等于“堆栈”(由“堆”和“栈”组成)R[sp]←R[sp]-2、M[R[sp]]←R[ax]为什么AL在栈顶?小端方式!执行前执行后栈底新栈顶栈底栈顶•栈(Stack)是一种采用“先进后出”方式进行访问的一块存储区,用于嵌套过程调用。
从高地址向低地址增长R[ax]←M[R[sp]]、[sp]←R[sp]+2执行前执行后原栈顶处的数据送AX080483d4<add>: 80483d4: 55push %ebp80483d5: 89 e5mov %esp, %ebp 80483d7: 83 ec 10 sub $0x10, %esp 80483da: 8b 45 0c mov 0xc(%ebp), %eax 80483dd: 8b 55 08 mov 0x8(%ebp), %edx 80483e0: 8d 04 02 lea (%edx,%eax,1), %eax80483e3: 89 45 fc mov %eax, -0x4(%ebp)80483e6: 8b 45 fc mov -0x4(%ebp), %eax 80483e9: c9 leave 80483ea:c3 ret“objdump -d test” 结果add函数中有哪些传送指令?每一条传送指令的功能是什么?R[esp]←R[esp]-4;M[R[esp]]←R[ebp]R[ebp]←R[esp]R[eax]←M[R[ebp]+12]R[edx]←M[R[ebp]+8]R[eax]←R[edx]+R[eax]M[R[ebp]-4]]←R[eax]R[eax]←M[R[ebp]-4]]指令的功能用RTL 描述080483d4<add>: 80483d4: 55push %ebp 80483d5: 89 e5mov %esp, %ebp 80483d7: 83 ec 10 sub $0x10, %esp80483da: 8b 45 0c mov 0xc(%ebp), %eax 80483dd: 8b 55 08 mov 0x8(%ebp), %edx 80483e0: 8d 04 02 lea (%edx,%eax,1), %eax 80483e3: 89 45 fc mov %eax, -0x4(%ebp)80483e6: 8b 45 fc mov -0x4(%ebp), %eax 80483e9: c9 leave 80483ea: c3 retadd 函数从80483d4开始!“objdump -d test” 结果执行add时,起始EIP=?EIP ←0x80483d4程序的执行过程如何?周而复始执行指令!指令如何执行?根据EIP取指令指令译码取操作数指令执行回写结果修改EIP的值取并执行指令OP举例控制器A L U标志寄存器地址数据控制GPRs017bfff002080483d680483d580483d4080483d4<add>: 80483d4: 55push %ebp80483d5: 89 e5mov %esp, %ebp 89e5EBP ESPEIPbfff0020bfff0000bfff000080483d480483d45589e583Rd5589e58355MDR5589e58380483d4S1:取指令IR5589e583RdS2:指令译码S3:指令执行MARbeeefffc5545控制器A L U标志寄存器地址数据控制GPRs017bfff002080483d680483d580483d4080483d4<add>: 80483d4: 55push %ebp80483d5: 89 e5mov %esp, %ebp 5589e5EBP ESPEIPbfff0020bfff000080483d455MDR80483d4S1:取指令IRS2:指令译码S3:指令执行MARbeeefffc45bfff0000控制器A L U标志寄存器地址数据控制GPRs017bfff002080483d680483d580483d4080483d4<add>: 80483d4: 55push %ebp80483d5: 89 e5mov %esp, %ebp 5589e5EBP ESPEIPbfff0020bfff000080483d455MDR80483d4S1:取指令IRS2:指令译码S3:指令执行beeefffc MARbeeefffc45控制器A L U标志寄存器地址数据控制GPRs017bfff002080483d680483d580483d4080483d4<add>: 80483d4: 55push %ebp80483d5: 89 e5mov %esp, %ebp 5589e5EBP ESPEIPbfff0020bfff000080483d455MDRS1:取指令IRS2:指令译码S3:指令执行beeefffc MARbeeefffcbeeefffc54控制器A L U标志寄存器地址数据控制GPRs017bfff002080483d680483d580483d4080483d4<add>: 80483d4: 55push %ebp80483d5: 89 e5mov %esp, %ebp 5589e5EBP ESPEIPbfff0020bfff000080483d4Wr55MDRS1:取指令IRWrS2:指令译码S3:指令执行beeefffc MARbeeefffcbeeefffcbfff0020bfff0020beeefffc45控制器A L U标志寄存器地址数据控制GPRs017bfff002080483d680483d580483d4080483d4<add>: 80483d4: 55push %ebp80483d5: 89 e5mov %esp, %ebp 5589e5EBP ESP EIPbfff0020bfff0000Wr55MDRS1:取指令IRWrS2:指令译码S3:指令执行beeefffc MARbeeefffcbeeefffc bfff0020bfff0020beeefffc2000ff bf 80483d445指令执行过程控制器A L U标志寄存器地址数据控制GPRs017bfff002080483d680483d580483d4080483d4<add>: 80483d4: 55push %ebp80483d5: 89 e5mov %esp, %ebp 5589e5EBP ESPEIPbfff0020bfff000080483d555MDRS1:取指令IRS2:指令译码S3:指令执行、EIP增量beeefffc MARbeeefffcbeeefffcbfff0020bfff0020beeefffc2000ff bf 开始执行下一条指令45WrWr传送指令举例将以下Intel格式指令转换为AT&T格式指令,并说明功能。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
TITLE 伪指令将整行标为注释
INCLUDE伪指令后跟文件名,指定从某一文件中拷贝必需的信息
.code伪指令用来标记代码段的开始,程序中所有可执行语句都放于此处
PROC伪指令允许声明一个过程并且附带参数列表,其使用格式为
label PROC { [,parameter_1] }
每个参数的格式为参数名:类型
ENDP伪指令标识子程序的结束
END伪指令标明该行是汇编程序的最后一行,编译器将忽略该行后面的所有内容
.386伪指令指出了程序要求的最低CPU(Intel386)
.MODEL伪指令指示编译器哪种模式程序生成代码
STDCALL伪指令允许程序调用MS-Windows函数
PROTO伪指令声明了程序使用的子程序
INVOKE是一个用于调用过程或函数的汇编伪指令
BYTE,SBYTE等类似的,用于定义数据的伪指令。
早期还是用DB,但DB无法区分是否有符号DUP操作使用一个常量表达式作为计数器来重复分配存储空间。
即使用DUP可以一次分配多个空间,并且决定对此空间进行全部初始化或全部都不初始化
.DAT A伪指令可用于声明未初始化数据,它在定义大块的未初始化数据时非常有用,因为它可以缩小编译后的程序尺寸
=(等号伪指令)将符号名和整数表达式联系起来。
以=定义的符号可重定义任意多次EQU伪指令将符号名和整数表达式或任意文本联系起来。
三种使用格式
name EQU expression 有效的整数表达式
name EQU symbol 已被=或EQU定义的符号
name EQU <text>
用EQU定义的符号不能在同一源代码文件中重复定义
TEXTEQU伪指令可用来创建文本宏(text macro)
OFFSET操作符返回一个变量相对于其所在段开始的偏移,即返回数据标号的偏移地址PTR操作符允许重载变量的默认尺寸
TYPE操作符返回数组中每个元素的大小(以字节计算)
LENGTHOF操作符返回数组内元素的数目。
注意对在DUP的嵌套使用和换行的情况SIZEOF操作符返回数组初始化时占用的字节数。
即返回LENGTHOF和TYPE返回值的乘积ALLIGN伪指令将变量的位置按字节、字、双字边界对齐ALLIGN 1|2|4。
数据对齐可能会浪费一部分存储空间,但CPU处理存储在偶数地址的数据比处理存储在奇数地址的
数据要快
LABEL伪指令允许插入一个标号并赋予其尺寸属性而无需分配任何实际的存储空间
JMP指令导致向代码段内的目标地址做无条件转移
LOOP指令提供了一种将程序块重复执行特定次数的简单方法。
ECX被自动用作计数器。
并且注意LOOP指令的执行是分两步:首先,ECX减1,接着与0比较。
根据比较的
结果来决定是否发生跳转
.NOLIST伪指令禁止编译器在创建的列表文件中显示这些源文件行。
.LIST伪指令允许显示后面文件行
USES与PROC伪指令配套使用的USES操作符允许列出被过程修改的所有寄存器,它只是编译器做两件事情:首先,在过程的开始出生成PUSH指令在堆栈上保存寄存器;其
次,在过程的结束处生成POP指令恢复这些寄存器的值。
LOCAL伪指令在过程内声明一个或多个命名局部变量,语句必须紧跟在PROC伪指令所在行
之后
LOCAL 变量列表
每个变量定义的格式如下,标号:类型
PROTO伪指令为一个已存在的过程创建过程原型。
原型声明了过程的名字和参数列表,它允许一个过程在被定义之前就可以在其他地方被调用。
很类似C语言里面的函数声
明。
使用PROTO创建过程原型时,去掉原过程中的寄存器列表,但要给出相应的
参数列表。
它的作用类似于C语言中的函数声明
.MODEL伪指令可确定所用的内存模式。
它决定程序的几个重要特性:内存模式类型、过程命名方案和参数传递约定。
在IA-32中可以使用的内存模式有:
tiny,small,medium,compact,large,huge,flat。
它们之间的主要区别在于去代码段数据
段之间数量的区别,以及放置区别。
.MODEL伪指令的格式是:
.MODEL 内存模式[,模式选项]
模式选项可包含语言关键字或堆栈的远近选项。
语言关键字决定了过程和公共符号
的调用约定及命名约定。
在这里我们着重讲解
.MODEL falt,C
.MODEL falt,stdcall
.MODEL falt,pasca
.MODEL falt,C指定过程以反向顺序(从右往左)在堆栈上压入过程参数,在过
程调用之后堆栈参数的移出上,ESP要被加上一个常量,将堆栈指针重设为参数压
入之前的值
.MODEL falt,stdcall指定过程按照从右到左的顺序压入参数,在过程调用之后的
堆栈参数移除时,要求过程在RET指令后面必须提供一个常量操作数,RET指令
在堆栈上弹出返回地址之后把该常量同ESP相加
.MODEL falt,pasca指定过程按从左往右的顺序在堆栈上压入参数,在过程调用
结束后的堆栈参数移除上与.MODEL falt,stdcall相同
OPTION PROC:PRIVATE伪指令放在模块文件头部,使得模块中的所有过程都变成私有PUBLIC 伪指令指定任何想要导出的过程,使用例如:PUBLIC sub1,sub2,sub3
EXTERN伪指令用于在调用当前模块之外的过程时使用,它可以指定外部过程的名字和外部过程堆栈框架的大小。
ALLIGN伪指令设置下一个域或变量的地址对齐方式。
对齐,是为了取得最佳的I/O性能,结构的成员应该根据其数据类型进行对齐,否则CPU在访问结构的成员时就要花费
更多的时间ALLIGN datatype。