(1)条件语句被执行前需要进行两个步骤:首先,使用CMP,AND,SUB之类的指令修改CPU标志;其次,使用条件跳转指令测试标志值并导致向新地址的分支转移。
(2)Jcond指令
Jcond 目标地址
格式中的cond指的是一个标志条件.用来表示一个或多个标志的状态。
默认情况下,MASM要求跳转的目标在当前过程之内,为了突破这种限制,可以声明一个全局变量(变量后面跟“::”)。而且跳转目标和跳转指令的下一条指令之间的偏移地址差必须在-128到+127字节范围之内。这是因为当条件跳转指令被转换成机器指令时,目的操作数是用一个8位的偏移值来表示的。
(3)条件...
1. AND指令
AND指令在每对操作数的对应数据位之间执行布尔(位)“与”操作,并将结果存放在
目的操作数中。
AND 目的操作数,源操作数
AND指令总是清除溢出标志和进位标志,它依据目的操作数的值修改符号标志、零标
志和奇偶标志。
2. OR指令
OR指令在每对操作数的对应数据位之间执行布尔“或”操作,并将结果存放在目的操
作数个
OR 目的操作数,源操作数
OR指令总是清除溢出标志和进位标志。它根据目的操作数的值修改符号标志、零标志、
奇偶标志。
3. XOR指令
XOR指令在每对操作数的对应数据位之间执行布尔“异或”操作.并将结果存放在...
1. PROC伪指令
可以将过程(procedure)非正式地定义为以RET语句结束的命名语句块。过程使用PROC和ENDP伪指令来声明.另外还必须给过程起一个名字(一个有效的标识符)。
创建除了程序启动过程之外的其他过程时应以RET指令结束,以强制CPU返回到过程被调目的地方,同时最后ENDP结束过程。
2. CALL和RET指令
CALL指令指示处理器在新的内存地址执行指令,以实现对过程的调用。在过程中使用RET(return from procedure )指令使处理器返回到程序中调用过程的地方继续执行。从底层细节角度来讲,CALL指令将返...
1. JMP指令
JMP 目标标号
JMP指令导致向代码段内的目标地址做无条件转移。目标地址必须由代码标号(编译
器翻译成地址)标识。
2. LOOP指令
LOOP指令提供了一种将程序块重复执行特定次数的简单方法:
LOOP 目的地址
LOOP指令的执行包括2步:首先ECX减1后与0比较,若ECX不等于0则跳转到
目的地址指定的标号处;若ECX等于0则不发生跳转,这时控制权将转移到紧跟在LOOP
后面的指令处。
实地址模式下,做默认循环计数器的是CX;任何模式情况下,LOOPD指令都使用ECX作为循环计数器,而LOOPW都使用...
1. 间接操作数
间接操作数可以是任何用方括号括起来的32位通用寄存器(EAX,EBX,ECX,EDX,
ESI,EDI,EBP和ESP),寄存器里面存放数据的偏移。
PTR与间接操作数的联合使用:操作数的大小通常不明确,如:inc [esi]编译器在编译时会产生“operand must have size”的错误信息,可以使用PTR操作符明确地表示操作数的尺寸:inc BYTE PTR [esi]
2. 变址操作数
变址操作数将常量加到寄存器上以产生一个有效的地址,任何32位通用寄存器都可以
作为指针寄存器,MASM中允许使用两种...
1. OFFSET操作符、
OFFSET操作符返回数据标号的偏移地址,偏移地址代表标号距数据段开始的距离,单
位是以字节计算的,保护模式下偏移总是32位长的,实模式下偏移只有16位。
2. ALIGN伪指令
ALIGN伪指令将变量的位置按字节、字和双字边界对齐,格式:
ALIGN 边界值
边界值可以是1,2或4。
3. PTR操作符
PTR操作符重载操作数的默认尺寸。PTR必须和标准数据类型联合使用:BYTE、SBYTE、
WORD、SWORD、DWORD、SDWORD、FWORD、QWORD或TBYTE。
如假设将双字节变量的低16位送至AX...
1. INC和DEC指令
INC和DEC指令从操作数中加1或减1。
2. ADD指令
ADD 目的操作数,源操作数
加法操作不改变源操作数,相加的结果在目的操作数中。
3. SUB指令
SUB 目的操作数,源操作数
4. NEG指令 通过数字转换伟对应的二进制补码而求得其相反数。
NEG reg
NEG mem
5. 算术运算影响的标志
(1) 零标志和符号标志
算术指令的目的操作数赋予零值时,零标志就被相应设置
算术运算结果为负值时,符号标志就被设置
(2) 进位标志(无符号算术运算)
如果无符号加减法运算的结...
1. MOV指令
MOV destination,source
Mov指令对操作数的使用是非常灵活的,只要遵循以下的规则即可:
●两个操作数的尺寸必须一致。
●两个操作数不能同时为内存操作数。
●目的操作数不能是CS,EIP和IP。
●立即数不能直接送至段寄存器。
2. 整数的零/符号扩展
当试图使用MOV指令将整数值从一个较小的操作数中拷贝到一个较大的操作数中时,可能会导致错误,但有时确实需要这样移动数据。
(1) MOVZX(move with zero-extend)指令将源操作数的内容拷贝到目的操作数中,并将该值零扩展(zero...
1.等号伪指令
名字 = 表达式
可以重复定义
2.计算数组大小
MASM用$符号返回当前地址的偏移值。
例如:string BYTE 10,20,30,40
stringsize = ($ - string),关键之处,从句必须紧跟要计算数组之后
3.EQU伪指令
name EQU expression
name EQU symbol
name EQU <text>
不可重复定义
4.TEXTEQU
name TEXTEQU...
1.数据定义语句:[名称] 数据定义伪指令 初始值 [,初始值]......
数据定义语句中至少要有一个初始值或者“?”符号,?符号不想给数据赋任何特定值的时候使用。
2.数据类型
BYTE 8位无符号整数(字节)
SBYTE 8位有符号整数(字节)
WORD 16位无符号整数(字,也可以在实地址模式下用做近指针)
SWORD 16位有符号整数(字)
DWORD 32位无符号整数(双字,也可以在实地址模式下用做近指针)
SDWORD 32位有符号整数(双字)
FWORD ...
(1)整数常量:由符号(可选)开头,加上一个或多个数字以及一个表示数制基数的字符后缀(可选)构成: [+|-] digits [radix]
radix(基数后缀)可以是以下之—(大小写均可):
h十六进制,q/o八进制,d十进制,b二进制,r编码实数,t十进制(可选),y二进制(可选)。
以字母开头的十六进制常量前面必须加一个0,以防止汇编编译器将其解释为标识符。
(2)整数表达式
算数运算符:()圆括号,+、-单目加减,*、/、MOD乘除取模,+、-加减。 (3)实数常量
有两种类型的实数常量:十进制实数和...
1.invoke 过程名 [,参数1] [,参数2]......
Microsoft做的一件好事,在编译时候编译器将其展开为push和call指令。调用过程名指定的地址处的过程。
2.local 变量名1[[重复数量]][:类型],变量名2[[重复数量]][:类型] ......
局部变量定义
3.子程序名 proc [距离][语言类型][可视区域][USER寄存器列表][,参数:类型].......[VARARG]
local 局部变量列表
指令
子程序 end
子程序的定义方式。
4.函数名 proto [距...
make工具最主要也是最基本的功能就是通过描述文件来描述源程序之间的相互关系并自动维护编译工作,而描述文件需要按照某种语法进行编写,文件中需要说明如何编译各个源文件并链接生成可执行文件,并要求定义源文件之间的依赖关系,为了更方便使用,文件中同时可以用一些宏定义。
描述文件包含内容:
(1)注释 (2) 宏定义 (3)显式规则 (4)隐含规则
1.注释和换行 makefile中的注释是以#号开头一直到行尾的字符,当nmake工具处理到这些字符的时候,它会完全忽略#号及其后面的全部字符。 当一行的内容过长的时候,可以用换行符...
1.make工具的makefile文件
make工具可以看成是一个智能的批处理工具,它本身并没有编译和链接的功能,而是用类似于批处理的方式——通过调用makefile文件中用户指定的命令来进行编译和链接的。但是,批处理会执行全部命令将全部源文件编译,包括那些不必重新编译的源文件,而make工具则可根据目标文件上一次编译的时间和所依赖的源文件的更新时间自动判断应当编译哪些源文件,对没有更新过的文件不会处理,这样就可以大大提高程序调试的效率。
make可以根据文件的时间正确判断文件的新旧并执行相应的步骤。但make又是如何知道文件之间的依赖关系呢?这需要用户用一个描述文件来...
/AT Enable tiny model (.COM file)
/omf generate OMF format object file
/Bl<linker> Use alternate linker
/Sa Maximize source listing
/c Assemble without linking
/Sc Generate timings in listing
/Cp Preserve case of user identifiers
/Sf Generate first p...