004010A6? |.? 6A 11???????? push??? 11?????????????????????????????? ; /Count = 11 (17.)
004010A8? |.? 68 71214000?? push??? 00402171???????????????????????? ; |Buffer = cycle.00402171
004010AD? |.? 68 E9030000?? push??? 3E9????????????????????????????? ; |ControlID = 3E9 (1001.)
004010B2? |.? FF75 08?????? push??? dword ptr [ebp+8]??????????????? ; |hWnd
004010B5? |.? E8 0F020000?? call??? <jmp.&USER32.GetDlgItemTextA>??? ; \GetDlgItemTextA
004010BA? |.? 0BC0????????? or????? eax, eax
004010BC? |.? 74 61???????? je????? short 0040111F
004010BE? |.? 6A 11???????? push??? 11?????????????????????????????? ; /Count = 11 (17.)
004010C0? |.? 68 60214000?? push??? 00402160???????????????????????? ; |Buffer = cycle.00402160
004010C5? |.? 68 E8030000?? push??? 3E8????????????????????????????? ; |ControlID = 3E8 (1000.)
004010CA? |.? FF75 08?????? push??? dword ptr [ebp+8]??????????????? ; |hWnd
004010CD? |.? E8 F7010000?? call??? <jmp.&USER32.GetDlgItemTextA>??? ; \GetDlgItemTextA
004010D2? |.? 0BC0????????? or????? eax, eax
004010D4? |.? 74 49???????? je????? short 0040111F
004010D6? |.? B9 10000000?? mov???? ecx, 10?????????????????????????????????????????????????????????????????????????? ecx 賦值為 10
004010DB? |.? 2BC8????????? sub???? ecx, eax?????????????????????????????????????????????????????????????????????????????? =======================
004010DD? |.? BE 60214000?? mov???? esi, 00402160??????????????????? ;? ASCII "11111"
004010E2? |.? 8BFE????????? mov???? edi, esi
004010E4? |.? 03F8????????? add???? edi, eax
004010E6? |.? FC??????????? cld
減法指令SUB(SUBtract)
指令格式:SUB OPRD1,OPRD2
本指令的功能是進行兩個操作數(shù)的相減,即從OPRD1中減去OPRD2,其結(jié)果放在OPDR1中。指令的類型及對標志位的影響與ADD指令相同,注意立即數(shù)不能用于目的操作數(shù),兩個存儲器操作數(shù)之間不能直接相減。操作數(shù)可為8位或16位的無符號數(shù)或帶符號數(shù)。
例如:SUB DX,CX
SUB [BX+25],AX
SUB DI,ALFA[SI]
SUB CL,20
SUB DATA1[DI][BX],20A5H
加法指令 ADD(Addition)
指令格式:ADD OPRD1,OPRD2
OPRD1為任一通用寄存器或存儲器操作數(shù),可以是任意一個通用寄存器,而且還可以是任意一個存儲器操作數(shù)。這給程序的編寫帶來了很大的方便。
OPRD2為立即數(shù),也可以是任意一個通用寄存器操作數(shù)。立即數(shù)只能用于源操作數(shù)。
OPRD1和OPRD2均為寄存器是允許的,一個為寄存器而另一個為存儲器也是允許的,但不允許兩個都是存儲器操作數(shù)。理由是指令代碼的尋址方式中規(guī)定了兩個操作數(shù)(除立即數(shù))至少有一個是寄存器操作數(shù)。
加法指令運算的結(jié)果對CF、SF、OF、PF、ZF、AF都會有影響。以上標志也稱為結(jié)果標志。加法指令適用于無符號數(shù)或有符號數(shù)的加法運算。操作數(shù)可以是8位,也可以是16位。
例如:ADD AL,25;(AL)<--(AL)+25
ADD BX,0A0AH;(BX)<--(BX)+0A0AH
ADD DX,DATA1[BX]
ADD DI,CX;
ADD BETA[BX],AX
ADD BYTE PTR[BX],28
上述每一條指令及第六條指令為字節(jié)相加指令,其它四條均為字(雙字節(jié))相加指令。
格式:CLD
執(zhí)行的操作:
該指令使DF=0,在執(zhí)行串操作指令時,使SI和DI自動增量。
004010DB? |.? 2BC8????????? sub???? ecx, eax??????? 即??? ecx - eax = 10 - eax (eax 存放用戶名的長度)
假設(shè)輸入的用戶名為: 1111111111, 序列號為: 2222222222
004010D6? |.? B9 10000000?? mov???? ecx, 10????????????????????????????????????????????????????????????????????????????
004010DB? |.? 2BC8????????? sub???? ecx, eax
004010DD? |.? BE 60214000?? mov???? esi, 00402160????????????; 如果此處寫為 mov???? esi, dword ptr [402160]???? 那么執(zhí)行后,ESI 的值為 31313131
004010E2? |.? 8BFE????????? mov???? edi, esi
004010E4? |.? 03F8????????? add???? edi, eax
004010E6? |.? FC??????????? cld
ecx = 0x10;
ecx = 0x10 - 0x0A
esi = 00402160
edi= 00402160
edi=edi+eax = edi + 10
指令 CLD
CLD與STD是用來操作方向標志位DF(Direction Flag)。CLD使DF復(fù)位,即DF=0,STD使DF置位,即DF=1.用于串操作指令中。
例如:
MOVS ( MOVe String) 串傳送指令
MOVSB //字節(jié)串傳送 DF=0, SI = SI + 1 , DI = DI + 1 ;DF = 1 , SI = SI - 1 , DI = DI - 1
MOVSW //字串傳送 DF=0, SI = SI + 2 , DI = DI + 2 ;DF = 1 , SI = SI - 2 , DI = DI - 2
執(zhí)行操作:[DI] = [SI] ,將位于DS段的由SI所指出的存儲單元的字節(jié)或字傳送到位于ES段的由DI 所指出的存儲單元,再修改SI和DI, 從而指向下一個元素.