1. 程式人生 > >005-彙編加法指令ADD

005-彙編加法指令ADD

一、加法指令 ADD(Addition) 格式

格式:ADD A,B   //A=A+B;

功能:兩數相加

1. OPRD1為任一通用暫存器或儲存器運算元,可以是任意一個通用暫存器,而且還可以是任意一個儲存器運算元.

  OPRD2為立即數,也可以是任意一個通用暫存器運算元.立即數只能用於源運算元B.

2. AB均為暫存器是允許的,一個為暫存器而另一個為儲存器也是允許的, 但不允許兩個都是儲存器運算元.

 //也就是說AB不能同時是指標 如: add [eax],[ebx] 這類情況是錯的

例子:

第三課中的add函式裡 有如下2句程式碼

00401003  |.  8B45 08      MOV EAX,DWORD PTRSS:[EBP+8]             ;  a

00401006  |.  0345 0C      ADD EAX,DWORD PTR SS:[EBP+C]            ;  b //eax=a+b

二、ADD指令測試

int _tmain(int argc, _TCHAR* argv[])

{

         int i=0;

         printf("");

    i=i+0x100;

         i=i+0x111;

         int *p=&i;

         __asm

         {

                  mov eax,0x222

                  mov ebx

,0x100

                  add ebx,eax //ebx322

                  //

                  mov ebx,p

                  add [ebx],0x111//00401048 |.  8003 11       ADD BYTE PTR DS:[EBX],11                 ;  i=i+11

                  add i,0x111     //DWORD WORD

         }

         /*

         0040101C  |. 8B45 F8       MOV EAX,DWORD PTRSS:[EBP-8]             ;  eax=i=0

         0040101F  |.  0500010000   ADD EAX,100                              ;  eax=eax+100=0+100=100

         00401024  |. 8945 F8       MOV DWORD PTRSS:[EBP-8],EAX             ;  i=eax=100

         00401027  |. 8B4D F8       MOV ECX,DWORD PTRSS:[EBP-8]             ;  ecx=i=100

         0040102A  |. 81C1 11010000 ADD ECX,111                              ;  ecx=ecx+111=100+111=0x211

         00401030  |. 894D F8       MOV DWORD PTRSS:[EBP-8],ECX             ;  i=ecx=0x211

         00401033  |. 8D55 F8       LEA EDX,DWORD PTRSS:[EBP-8]             ;  edx=&i=ebp-8;

         00401036  |. 8955 FC       MOV DWORD PTRSS:[EBP-4],EDX             ;  p=&i

         00401039  |.  B822020000   MOV EAX,222

         0040103E  |.  BB00010000   MOV EBX,100

         00401043  |. 03D8          ADD EBX,EAX                              ;  ebx=ebx+eax=100+222=322

         00401045  |. 8B5D FC       MOV EBX,DWORD PTRSS:[EBP-4]             ;  ebx=i=edx=ebp-8

         00401048  |. 8003 11       ADD BYTE PTRDS:[EBX],11                 ;  i=i+11

         0040104B  |. 8145 F8 11010>ADD DWORD PTR SS:[EBP-8],111             ; i=i+111

         */

         printf("");

         return0;

}