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

1.ret结束程序和ExitProcess的区别

 

    在堆栈平衡的情况下,用ret结束程序,系统自然会调用ExitThread来结束线程;另外,如果是单线程进程,系统自然还会调用ExitProcess。然而,在这里我要说尽量不要使用ret结束进程或线程,原因如下:

    第一,汇编语言本身的特性使得我们,有可能因编程失误在结束程序前,堆栈并不平衡。

    第二,一些壳可能不清理堆栈,或者某些对二进制代码的二次开发操作的不严谨,也会产生同样的问题。

 

2.masn怎么使用unicode

 

使用masm库ucmacros.asm,在它里面有的两个宏:WSTR和uni$。自己看一看就明白了,非常容易理解。

 

3.第四种工作模式

 

Pentium及其后继处理器在“实模式、保护模式、虚拟86模式”基础上,又增加了一个“系统管理模式”,目的是实现对系统供电和系统功能进行管理。

 

4.以编程的角度用汇编实现switch

 

[1]分支数较少的实现——多个if

一般来说如果分支数少于4个或者分支条件不连续分布,那么我们直接用多个.if来实现就可以,如下:

.code

Start:

  mov eax, xxxx

  cmp eax,0

  je  BRA0

 

cmp eax,1

  je  BRA1

 

cmp eax,2

  je  BRA2

 

  cmp eax,3

  je  BRA3

BRA0:

  .....

BRA1:

  .....

BRA2:

  .....

BRA3:

  .....

End Start

[2]分支数较多的实现——跳转表法

采用.if条件二叉分支的方法,虽然简单,但随着分支数的增加,进入最后分支的等待平均时间越来越长,这极大的削弱了汇编语言的优势,为此提出了跳转表法。

具体做法:在内存中开辟一块连续的存储单元作为跳转表,表中按顺序存放各分支的跳转地址,进入分支处理程序前,通过查询跳转表来确定跳转地址。如下:

.Data

BASET dw BAR0,BAR1,BAR2,BAR3,…

.code

mov eax, xxxx

add eax,offset BASET

jmp dword ptr [eax]

BAR0:

  .....

BAR1:

  .....

BAR2:

  .....

BAR3:

  .....

 

5.用汇编实现函数递归调用

 其实这个很简单了,看下面的代码就可以了

 

fun proc

  pushaf

  .....

  cmp  xxx,xxx ;判断是否达到递归终值

  jz    Last

  ..... ;在这里进行某些递归过程内运算

  call  fun;递归调用

  jmp Fun_End

Last:

  .....

  mov xxx,xxx;给递归条件赋予递归终值

Fun_End:

  popaf

  ret

fun endp

 

 

 

你可能感兴趣的:(win32病毒)