(译)win32asm教程-8

原创 2002年03月15日 09:01:00
 

9.0更多的伪代码

这儿有更多的伪代码

TEST

Test对两个参数(目标,源)执行AND逻辑操作,并根据结果设置标志寄存器。结果本身不会保存。Test用来测试一个位,例如寄存器:

Test eax, 100b;b后缀意为二进制
jnz bitset

如果eax右数第三个位被设置了,jnz将会跳转。Test的一个非常普遍的用法是用来测试一方寄存器是否为空:

test ecx, ecx
jz somewhere

如果ecx为零,Jz跳转

关于栈的伪代码

在我讲栈的伪代码之前,我会先解释什么是栈。栈是内存的一个地方,esp为指向栈的指针。栈是用来保存临时数值的地方,有两个指令来放入一个指和再把它取出来:push和pop。Push把一个指压入栈。Pop再把它弹出来。最后一个放入的值最先出来。一个值被放入栈中,栈指针步减,当它移出来的时候,栈指针步增。看这个例子:

(1)mov ecx, 100
(2) mov eax, 200
(3) push ecx ; save ecx
(4) push eax
(5) xor ecx, eax
(6) add ecx, 400
(7) mov edx, ecx
(8) pop ebx
(9) pop ecx

解释

1、 100放入ecx

2、  200放入eax

3、  ecx(等于100)压入栈中(第一个压入)

4、  eax(等于200)压入栈中(最后压入)

5、  /6/7:对ecx执行操作,使ecx的值改变

8弹出ebx:ebx成为200(最后压入,最先弹出)
9弹出ecx:ecx又成为100(最先压入,最后弹出)

为了说明再压栈和弹栈时,内存中发生了什么,看下图:

Offset

1203

1204

1205

1206

1207

1208

1209

120A

120B

Value

00

00

00

00

00

00

00

00

00

 

 

 

 

 

ESP

 

 

 

 

(栈在这里是初始化为0,但实际上并不是这样。ESP表示ESP指向的offset)

mov ax, 4560h
push ax

Offset

1203

1204

1205

1206

1207

1208

1209

120A

120B

Value

00

00

60

45

00

00

00

00

00

 

 

 

ESP

 

 

 

 

 

 

mov cx, FFFFh
push cx

Offset

1203

1204

1205

1206

1207

1208

1209

120A

120B

Value

FF

FF

60

45

00

00

00

00

00

 

ESP

 

 

 

 

 

 

 

 

pop edx

Offset

1203

1204

1205

1206

1207

1208

1209

120A

120B

Value

FF

FF

60

45

00

00

00

00

00

 

 

 

 

 

ESP

 

 

 

 

Edx现在是 4560FFFFh 了.

CALL和RET

Call跳转到某段代码而且一发现RET指令就返回。你可以把它们看成在其他编程语言中的函数或子程序。例如:

……代码……
call 0455659
……更多代码……

455659处的代码:

add eax, 500
mul eax, edx
ret

当执行这条指令时,处理器跳到455659处的代码,执行指令一直到ret为止,并返回到调用处的下一条。Call跳转到的代码被成为过程(procedure)。你可以把你反复使用的代码写进一个过程并在你每次需要它的时候调用。

更深入的细节:call把EIP(指向将要执行指令的指针)压入栈,而ret指令在它返回的时候把它弹出来。你也可以给一个call指定的参数。这是由压栈来完成的:

push something
push something2
call procedure

在一个调用的内部,参数从栈中读出并使用。注意,只在过程中需要的局部变量也储存在栈中。我不会在此深入下去,因为它可以在masm和tasm中很轻易的完称。只要记住你可以写过程,而且它们可以由参数。一个重要的地方:

eax几乎总是用来装一个过程的返回值。

对于windows函数也是如此。但然,你可以在你的过程使用其他的寄存器,但这是标准。

(译)win32asm教程-9

 10.0 masm的优点如果你不在使用masm,你可以跳过这章并尝试着转换所有的例子,或不论如何地读一下,并试着说服自己使用masm。当然,这是你的选择。但masm真的使汇编语言更容易了。10.1 ...
  • taowen2002
  • taowen2002
  • 2002年03月15日 09:00
  • 757

(译)win32asm教程-2

 3.0 asm基础知识这章将教你汇编语言的基础知识1.  1伪代码(opcodes)汇编程序是用伪代码创建的。一个伪代码是一条处理器可以理解的指令。例如:ADDAdd指令把两个数加到一起。大部分伪代...
  • taowen2002
  • taowen2002
  • 2002年03月13日 08:59
  • 980

(译)win32asm教程-6

 7.0条件跳转在Code部分,你可以看到像这样的标签:.codemov eax, edxsub eax, ecxcmp eax, 2jz loc1xor eax, eaxjmp loc2loc1:x...
  • taowen2002
  • taowen2002
  • 2002年03月14日 09:51
  • 829

(译)win32asm教程-3

 4.0内存这部分将解释在Windows中内存是如何管理的。3.  1Dos和win3.xx在像用于Dos和Win3.xx的16位程序中,内存被分成许多个段。这些段的大小为64kb。为了存储内存,需要...
  • taowen2002
  • taowen2002
  • 2002年03月13日 08:59
  • 964

(译)win32asm教程-4

 5.0伪代码伪代码是给处理器的指令,它实际上是原始十六进制代码的可读版。因此,汇编是最低级的编程语言。汇编中的所有东西被直接翻译为十六进制码。换句话说,你没有把高级语言翻译为低级语言的编译器上的烦恼...
  • taowen2002
  • taowen2002
  • 2002年03月13日 08:58
  • 916

(译)win32asm教程-5

 6.0 文件结构汇编源文件被分成了几个部分。这些部分是code,data,未初始化data,constants,resource和relocations,资源部分是资源文件创建的,后面会有更多的讨论...
  • taowen2002
  • taowen2002
  • 2002年03月14日 09:51
  • 799

(译)win32asm教程-10

 11.0 Windows中的汇编基础现在你已经有了一些汇编语言的基础知识,你将要学习在Windows中怎样学习汇编。10.1APIWindows编程的根本在于Windows API,应用程序接口。这...
  • taowen2002
  • taowen2002
  • 2002年03月16日 18:54
  • 1074

(译)win32asm教程-7

 8.0关于数的一些事情在大多数的编程语言中使用整数还是浮点数只取决于变量的声明。在汇编语言中,完全的不同。浮点数的计算是由特别的伪代码和FPU协处理器(浮点单元)完成的。浮点指令将会在后面讨论。先来...
  • taowen2002
  • taowen2002
  • 2002年03月15日 09:01
  • 836

(译)Win32Asm 教程-1

Win32Asm 教程这是我的Win32Asm教程。它总是创建中,但我会不停地添加内容。通过上面的next和prev链接,你可以转到后面和前面一页。介绍先来对这个教程做个小介绍。Win32Asm不是一...
  • taowen2002
  • taowen2002
  • 2002年03月11日 09:16
  • 1448

(译)win32asm教程-11

 12.0 第一个程序是创建你的第一个程序的时候了。本章中的指导将这样组织:12.1第一步如果万事具备,你应该在你的masm同一个区上有一个win32(或win32asm)目录。为每个工程,你应该创建...
  • taowen2002
  • taowen2002
  • 2002年03月16日 18:52
  • 908
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(译)win32asm教程-8
举报原因:
原因补充:

(最多只允许输入30个字)