CEAA教程:A Very In Depth Tutorial on Auto Assembler(二)

--------------- 
III.e Call and Ret 
--------------- 
  
Call 函数和JMP 函数很相似。 唯一的不同是Call有个返回到之前代码的功能。这个简单例子利用了下面的两个函数。

  Code:
  mov [0100579C],10  //把地址的值改成10
  cmp [0100579C],0    //把它和0进行比较
  call NameGoesHere  //调用或者跳转到 NameGoesHere 
  jmp 01002FF5  
                        
  NameGoesHere: 
  dec [0100579C]       //地址的值减1 
  cmp [0100579C],0   //跟0进行比较
  jne NameGoesHere  //如果不想等就返回到
                                  //NameGoesHere的开始,否则 继续
  ret                           //返回到之前,刚好是调用(call)函数之后


--------------- 
III.f Others 
--------------- 

现在,很显然,在Auto Assembler还有很多很多其他的函数,不然它就是个很局限的语言。
我会继续尽我所能解释更多的函数。 (哦,老兄...) 
  
````` 
Nop 
````` 
Nop: 这个我之前提过。 它意味着 "无操作", 大体上它可以抵消它之前的代码。
  
````` 
Inc/Dec 
````` 
  
Inc: 加一。 用于给寄存器或地址加一。 用法如下。   

  Code:  
  inc eax 


Dec: 减一,跟Inc似的
  
````` 
Add/Sub 
````` 
  
Add: 加法。 用法如下。 

  Code:  
  add eax,02 //给eax加2,并且将结果保存在eax中


Sub: 减法,用法类似Add 

````` 
Lea 
````` 

这个有点让人迷糊, 但还是继续吧。看下边的脚本。 
  Code:  
  mov eax,00123ABC 
  lea ebx,[eax+DEF] 

也许你分不清楚,[eax+DEF] 是一个指针。 LEA把后面被指向的[eax+DEF]的地址替换给前面被指向的ebx里。
  
````` 
And/Or/Xor 
````` 
好,我不知道如何清晰的说明“异或(xor)”在英文中的含义 –很多网站都只是用几行字这么描述的... 

  Them  wrote:  
  我估计你明白这些逻辑操作符的行为


如果谁能给我用英文为XOR做个定义我将感激不尽。即使如此,我还是不需要帮助就能解释它们是如何在汇编中工作的。 ;) 
首先,它们都有着类似于add、sub命令一样的语法,如下。

  Code:  
  and eax,ebx 


每个eax 和 ebx 都可能是任何东西。哦不对, 他不可能是 "mymom"。 -。-; 
回到脚本。来处理这个,(对,我知道我们都不是电脑...) 我们先要给两个寄存器值。就把12给eax,把27给ebx吧。下面,我们把它换成二进制的—那个零和一的语言。 =O 有问题吗?

  You  wrote:  
怎么把十进制转成二进制啊?  

我的傻朋友啊, 你怎么把你的好友计算器给忘了,用十进制把数输入,然后再点二进制啊! 有些事情需要注意,计算器不允许输入小数,它会简单的四舍五入下然后再转成二进制。
我搞出了:


  Code:
  EAX =  1100 
       & 
  EBX = 11011 

好,还能回想起小学时做的数学填空题吗?让我们在这儿做下。


  Code:
  
  and eax,ebx 
  
  EAX =  1100 
  EBX = 11011 
  ------------ 
  

现在,ADD(与)方法是如果都是1则是1,否则就是0。那就让我们来做出这道题吧。


  Code:
  
  and eax,ebx 
  
  EAX = 01100  (加个0更轻松) 
  EBX = 11011 
  ----------------- 
           01000 
  

现在我们把01000改成十进制,我们就会得到8,那个被存在EAX里的值。
接下来, 是OR(或) 函数。 现在让我们用相同的方法来轻松一下


  Code:  
  
  or eax,ebx 
  
  EAX = 01100 
  EBX = 11011 
  ----------------- 
  

OR函数的功能与AND函数正相反。都是0,则得0, 否则就得1。 


  Code:  
  
  or eax,ebx 
  
  EAX = 01100 
  EBX = 11011 
  ------------------ 
           11111 
  

把11111转成十进制,那会得到31,是EAX里存的值。
最后,是XOR(异或)函数。还是用那个方法。


Code:
  xor eax,ebx 
  
  EAX = 01100 
  EBX = 11011 
  ----------------- 
  

好,XOR函数是如果两个数相同就得0,不同就得1。


  Code:
  
  xor eax,ebx 
  
  EAX = 01100 
  EBX = 11011 
  ----------------- 
           10111 
  

我们把它转换成23,而23就是储存在EAX里的值。顺便一提,无论当我们写的是脚本、代码还是别的什么,你都不需要考虑EAX里面装的什么BlahBlahBlah的东西, 我之所以这么做是让你知道它是如何工作的。

````` 
好,这就是你所有需要知道的命令,(伙计,这可真长...) 让我们开始下一章节吧...

你可能感兴趣的:(CEAA教程:A Very In Depth Tutorial on Auto Assembler(二))