005-彙編加法指令ADD
一、加法指令 ADD(Addition) 格式
格式:ADD A,B //A=A+B;
功能:兩數相加
1. OPRD1為任一通用暫存器或儲存器運算元,可以是任意一個通用暫存器,而且還可以是任意一個儲存器運算元.
OPRD2為立即數,也可以是任意一個通用暫存器運算元.立即數只能用於源運算元B.
2. A和B均為暫存器是允許的,一個為暫存器而另一個為儲存器也是允許的, 但不允許兩個都是儲存器運算元.
//也就是說A與B不能同時是指標 如: 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
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;
}