现在的位置: 首页 > 综合 > 正文

你可能不了解的汇编(上)

2013年02月21日 ⁄ 综合 ⁄ 共 1512字 ⁄ 字号 评论关闭

汇编学的还不错同学,基本上是从16位汇编起家的,后来学32位汇编时估计不会一字一句的看书,学16位汇编时也可能会遗漏不少东西。以下是我的体会,欢迎大家分享、指教。

 

1.从PUSH开始谈新指令

   你应该知道push、pushad、pushfd这三条指令,但是大部分人不知道还有pushd、pushw、pusha、pushf这四条指令;对应的还有popa、popf,但没有popd、popw。

 

你不知道或不熟悉的指令还有很多很多,比如

①xadd   交换并相加

②bswap指令指定的32位寄存器的字节次序变反③

④cmpxchg比较并交换

⑤cmpxchg8八字节比较并交换

.....

2.AND、OR、XOR、NOT、SHL、SHR既是指令助记符又是逻辑运算符

这里以AND为例:

and EAX,DATA1 and DATA2

 

另外说一句,关系运算符EQ(等于)、NE(不等于)、LT(小于)、GT(大于)、LE(小于等于)、GE(大于等于),也可以写入像上面指令一样写入指令里。比如:

mov EAX,1 GT 0;关系成立,EAX=0FFFFFFFFH

mov EAX,0 GT 1;关系不成立,EAX=0H

3.模块伪指令

  初学写32位汇编的大概都以为,“CODE SEGMEMT”是16位汇编的模块专用的,而32汇编模块只能使用“.code .data”这样的伪指令。

事实上,“xxx SEGMEMT”在32位汇编里叫做“完整段定义伪指令”,可以继续使用,只是没有必要,因为win操作系统的内存分配管理比DOS的内存分配管理简单的多。而“.xxxx”的称为“简化段定义伪指令,被简化到只有一个参数,即段名称。

举例:

.code Virus

   Start:

   .....

   .....

end Start

 

我们用PEeditor看一下:

还有,

 

4.数据定义伪指令

 估计大家一定知道常用的数据定义伪指令,来定义字节、字、双字、以及结构体即:

DB/BYTE和SBYTE

DW/WORD和SWORD

DD/DWORD和SDWORD

STRUC/STRUCT

 

不过,这些还远远不够,请看下面:

DF/FWORD 32位偏移地址的远指针

DQ/QWORD 4字变量(8字节)

DT/TBYTE 十字节变量

REAL4、REAL8、REAL10 定义单、双精度和十字节的浮点数

EVEN 取偶偏移地址

ALIGE 对齐边界地址

RECODE以及和它相关的WIDTH、MASK

 

5.特殊的宏操作符&、%、!、<>、;;

&:替换操作符,强制将宏参数传入的变量名称替换该参数,来与其他字符组合结合。 

< > ——字符串传递操作符,用于括起字符串。在宏调用中,如果传递的字符串实参数含有逗号、空格等间隔符号,则必须用这对操作符,以保证字符串的完整。

!  ——转义操作符,用于指示其后的一个字符作为一般字符,而不含特殊意义。
%——表达式操作符,用在宏调用中,表示将后跟的一个表达式的值作为实参,而不是将表达式本身作为参数。
;;——宏注释符,用于表示在宏定义中的注释。采用这个符号的注释,在宏展开时不出现。

举例:

Test macro para

TestStr db 'Hello,&para'

endm

 

Test world;展开后为 Test db ‘Hello,World’

6.".if .else"等流程控制伪指令与与状态标志符操作符
刚学.if这类流程控制伪指令时,总是认为其不能替代跳转指令,究其原因是不了解“状态标志操作符”
CARRY?  表示CF标志位
OVERFLOW?  表示OF标志位
ZERO?  表示ZF标志位
SIGN?  表示SF标志位
PARITY? 表示PF标志位
举例:
sub eax,ebx
.if  ZERO?
   dec ecx
.endif

抱歉!评论已关闭.