能力值:
( LV2,RANK:10 )
在线值:
|
-
-
2 楼
小弟的学习笔记:
Microsoft Macro Assembler
pushfd
压 EFL 入栈
pushad
压 EAX、ECX、EDX、EBX、ESP、EBP、ESI、EDI 依次入栈
寄存器
ESP
堆栈指针寄存器
EIP
指令指针寄存器
标志位
AF
辅助进位标志
CF
进位标志
DF
方向标志
IF
中断标志
OF
溢出标志
PF
校验标志
SF
符号标志
TF
陷阱标志
ZF
零标志
处理器控制指令
esc
hlt
停机指令
lock
nop
空操作指令
wait
双字转换成四字指令
cdq
把EAX的符号为(即31位)复制到EDX的每一位上。这样,就生成了一个带符号的四字,保存在EDX:EAX中。
0
EAX -> 4AAFCC46 -> 01001010101011111100110001000110
EDX -> 0000264E -> 00000000000000000010011001001110 -> 00000000000000000000000000000000
1
EAX -> 00000211 -> 00000000000000000000001000010001
EDX -> 00000000 -> 00000000000000000000000000000000 -> 00000000000000000000000000000000
标志处理指令
clc
清除进位标志
Clear Carry
Usage: clc
Modifies flags: CF
Clears the Carry Flag
cld
cli
cmc
lahf
sahf
stc
std
sti
保护模式操作指令
arpl
clts
lar
lgdt
lidt
lldt
lmsw
lsl
ltr
sgdt
sidt
sldt
smsw
str
verr
verw
Shift Arithmetic Right
算术右移位指令
sar
右移位但保持最高位
sar eax,1
0
eax -> 00000000000000000000000000101001 -> 00000000000000000000000000010100
1
eax -> 10000000000000000000000000101001 -> 10000000000000000000000000010100
算术指令
算术除法指令
idiv ecx
1
eax -> 00000457 -> 0000006F
ecx -> 0000000A
edx -> 00000000 -> 00000001
---------------------------
eax -> 被除数 -> 1111
ecx -> 除数 -> 10
商数 -> eax -> 111
余数 -> edx -> 1
2
eax -> 0087AA17 -> 00000045
ecx -> 0001F31D
edx -> 00000000 -> 00012346
ebx -> 00DB15E0
3
eax -> 4AAFCC46 -> 0000264E
ecx -> 0001F31D
edx -> 00000000 -> 00016B70
ebx -> 00DB15E0
算术乘法指令
算术带符号数乘法指令
imul
1
乘数作为一个操作数,被乘数在指令中不明确指定,系统假定其长度同于乘数,若为8位乘数则被乘数在AL中,若为16位乘数,则被乘数在AX中,若为32位乘数则被乘数在EAX中
imul ecx
1
eax -> 834E0B5F -> 5457CFFA
ecx -> 4AAFCC46
edx -> 00000000 -> DB9EEE23
2
eax -> 834E0B5F -> 54457F4F
ecx -> 00000211
edx -> 004AD7B0 -> FFFFFEFE
2
imul edx,edx,41A7
1
eax -> 00000000 -> 00000000
ecx -> 0001F31D -> 0001F31D
edx -> 00000211 -> 0087AA17
2
eax -> 00000045
ecx -> 0001F31D
edx -> 00012346 -> 4AB2C8AA
3
eax -> 0000264E
ecx -> 0001F31D
edx -> 00016B70 -> 5D348610
算术无符号数乘法指令
mul
比较指令
CMP AL,22
CMP EAX,1000
不同则 C 置 1 值
相同则 Z 置 1 值
cmp eax,edx
eax -> 0000001D
edx -> 00000001
P -> 1 -> 0
OR EAX,EAX
如果 EAX 不是 0 则 Z 置 0 值
TEST EAX,EAX
相同但 EAX 非 0 则 Z 置 0 值
相同但 EAX 是 0 则 Z 置 1 值
TEST AL,AL
相同但 AL 非 0 则 Z 置 0 值
相同但 AL 是 0 则 Z 置 1 值
TEST byte ptr ss:[esp+30],1
TEST 81,1
不同则 Z 置 0 值
跳转指令
JA SHORT ASCIIArt.004161F1
cmp esi,eax
esi -> 00000010
eax -> 000001E0
ja short ACDSee32.0047E232
esi大于eax则跳
Z 是 0 但 C 是 1 不跳
Z 是 0 但 C 是 0 则跳
jb short ACDSee32.00484CAB
1
C -> 0 -> Jump is NOT taken
C -> 1 -> Jump is taken
2
cmp eax,ecx
jb short ECLTrial.0041061F
;如果 EAX 大于 ECX 则跳。注意相等则不跳
JBE short ACDSee32.00484A6C
cmp dword ptr ds:[edi+4],ebx
ebx -> 00000001
ds:[004A73F4] -> 000000F1
jbe short ACDSee32.00487A6C
dword ptr ds:[edi+4]小于或等于ebx则跳
je
0
cmp eax,-1
eax -> 00DB0000
je ACDSee32.00484AB4
eax 等于 -1 则跳
1
test edi,edi
edi -> 00DB15E0
je short ACDSee32.0047E232
edi 为 0 则跳
Z 是 1 则跳
Z 是 0 不跳
jg short ASCIIArt.00401A8E
S 是 1 不跳
S 是 0 则跳
jge short ASCIIArt.00401A97
Z 是 0 但 S 是 0 则跳
Z 是 0 但 S 是 1 不跳
jl short ACDSee32.0047E4DB
cmp eax,ebx
eax -> 000000D8
ebx -> 00000001
jl short ACDSee32.00484A6C
eax小于ebx则跳
S 是 0 不跳
S 是 1 则跳
jle short CHMUnPac.0041F864
Z 是 1 但 S 是 0 则跳
Z 是 0 但 S 是 1 则跳
Z 是 0 但 S 是 0 不跳
jmp ECX
无条件跳
jnb short editplus.004B2860
cmp edi,ebp
edi -> 004A73F0
ebp -> 004A93E8
jnb short ACDSee32.00484A79
ebp小于edi则跳
C 是 0 则跳
C 是 1 不跳
jne Calc17.00404254
test eax,eax
eax -> 004AD7B0
jnz short ACDSee32.004801D5
eax不为0则跳
Z 是 0 则跳
Z 是 1 不跳
jnz short Calc17.00403772
test eax,eax
eax -> 00DB15E0
jnz short ACDSee32.00484AC8
eax不为0则跳
Z 是 1 不跳
Z 是 0 则跳
浮点数指令
fabs
取绝对值(栈顶内容符号位置0)
fadd
实数加法
faddp
实数加法并出栈
faddp st(1),st
ST0 zero 0.0
ST1 zero 0.0 -> empty +UNORM 2679 02E90000 4020027F
fchs
符号反号(栈顶内容符号位取反)
fcom
实数比较
fcomp
实数比较并出栈
fcompp
实数比较且两个操作数出栈
fdiv
实数除法
fdivp
实数除法且出栈
fdivr
实数反除
fdivrp
实数反除且出栈
fiadd
整数加法
ficom
整数比较
ficomp
整数比较并出栈
fidiv
整数除法
fidivr
整数反除
fild
fistp
fistp qword ptr ss:[ebp-4]
fisub
整数减法
fisubr
整数反减
fld
取实数(源操作入栈)
fld src
1
fld qword ptr ds:[004013A8]
004013A8
00 00 00 00 00 00 00 00
ST0 zero 0.0
2
fld qword ptr ds:[004013A8]
004013A8
48 E1 7A 14 AE 3F 60 40
ST0 empty -??? FFFF 00FF00FF 00FF00FF -> valid 129.99000000000000000
fldcw
fldcw word ptr ss:[ebp-4]
fmul
实数乘法
fmulp
实数乘法且出栈
fnop
空操作
frndint
栈顶内容舍入为整数
fsqrt
求平方根
fstcw
fstcw word ptr ss:[ebp-2]
fstp
存实数并出栈
fstp qword ptr ds:[004013A8]
ST0 zero 0.0 -> empty +UNORM 2679 02E90000 4020027E
fsub
实数减法
fsubp
实数减法并出栈
fsubp st(1),st
ST0 valid 67.900000000000010240 -> valid 62.099899999999989760
ST1 valid 129.99990000000000000 -> empty -??? FFFF 00000000 00000000
fsubr
实数反减
fsubrp
实数反减并出栈
fsubrp st(1),st
ST0 valid 67.900000000000010240 -> valid -62.099899999999989760
ST1 valid 129.99990000000000000 -> empty -??? FFFF 00000000 FFFFFFFF
ftst
栈顶寄存器的内容与0比较
fxam
检验栈顶寄存器中数据的特殊情况,检验结果由状态字条件码C3、C2、C1、C0表示
fxch
fxch st(1)
fxtract
分解指数和尾数
gdi32.CreateFontIndirectA
push ebx
;pLogfont
call <jmp.&gdi32.CreateFontIndirectA>
user32.SendDlgItemMessageA
push 1
;lParam
push eax
;wParam
push 30
;Message = WM_SETFONT
push dword ptr ss:[ebp+8]
;ControlID
call <jmp.&user32.SendDlgItemMessageA>
有符号
7FFFFFFFh = +002147483647d
00000001h = +000000000001d
00000000h = 000000000000d
FFFFFFFFh = -000000000001d
80000000h = -002147483648d
无符号
00000000h = 000000000000d
FFFFFFFFh = +004294967295d
小弟对内容错误产生的任何后果概不负责!
|