ASM Base Element
範圍:
8bit:AH,AL,BH,BL,CH,CL,DH,DL
16bit:AX,BX,CX,DX,SI,DI,SP,BP
32bit:EAX,EBX,ECX,EDX,ESI,EDI,ESP,EBP
mov para, value ;para=value
movzx para, value ;可直接將小值的value賦值到para
movsx para,value ;若value範圍小於para則para低位等於value,高位爲para的最高位的值填充
如:
var1 BYTE 81h
mov AH, var1 ;AH = 81h
movzx bx, var1 ;bx = 0081h
movsx edx bx ;eax=FFFFFF81h
LAHF:Load EFLAGS to AH
SAHF:Copy AH to EFLAGS
XCHG:exchange data,規則等同於mov,但是不允許直接操作。如替換var1,var2可藉助於寄存器
mov ax,var1
xchg ax, var2,
mov var1,ax
arrayB BYTE 10h,20h,30h,40h
mov AL, arrayB+2 ;30h
arrayW WORD 100h,200h,300h
mov CX,arrayW+2 ;需要arrayW+2的倍數(對於WORD或者Doubleword數組,以16bit爲單位移動)
DWORD則需要按4的倍數移動
INC var: var加一
DEC var: var減一
NEG var: 取var的負數。如:
var SWORD 0A0h ;var=160
NEG var ;var=FF60h = -160
SF:Sign Flag,當操作結果爲負數爲1
CF:Carry Flag,表示數據上界溢出.如:
mov ax,00FFh
add ax,1
結果:CF = 1, ax=0000h
ZF:Zero Flag表示數據下界溢出.如:
mov ax,0000h
dec ax
結果:ZF = 1, ax=FFFFh
OF:Overflow Flag,僅僅關於有符號算法的操作中溢出。如:
mov AL, +127 ;AX=127
add AL, 1 ;OF=1 AX=FFFFh
兩個正數相加超過範圍成爲負數,或兩個負數相加超過範圍成爲正數。
OFFSET:偏移。注意:偏移的地址爲前地址+前數據長度。如:
bVal BYTE ?
dVal DWORD ?
mov ESI, dVal ;ESI=0x00405000
mov ESI, bVal ;ESI=0x00405004
myArray WORD 10,20,30,40,50
mov ESI, OFFSET myArray ;ESI=0x00405007
mov ESI, OFFSET myArray+2 ;ESI=0x00405009
ALIGN:對齊。注意:對齊的地址爲前地址+前數據長度。
bVal BYTE ? ;0x00405000h
ALIGN 8 ;將長度擴充爲8個字節
wVal WORD ? ;0x00405008h
bVal2 DWORD ? ;0x0040500Ah(WORD長度爲2)
PTR: 強制轉換類型。如:
myDouble DWORD 12345678h ;由低到高 0x78 0x56 0x34 0x12
;對於Litter-Endian機器
;mov AL, myDouble ;error
mov AL, BYTE PTR myDouble ;0x78
mov ax, WORD PTR myDouble ;0x5678
mov AL, BYTE PTR myDouble+2 ;0x34
TYPE:類型佔用的字節數
myDouble DWORD 12345678h
typeDouble BYTE TYPE myDouble
mov AL, typeDouble ;AL=0x04
LENGTHOF:獲取個數;SIZEOF:獲取字節數
array1 WORD 5 DUP(3 DUP(?))
arrLen byte LENGTHOF array1 ;5*3=15個
arrSize byte SIZEOF array1 ;15*2BYTE=30BYTE
LABEL:不分配內存,可用於獲取內存中的數據
var8 LABEL BYTE
var16_1 WORD 1234h
;var8 = 0x34
var32 LABEL DWORD
var16_1 WORD 1234h
var16_2 WORD 5678h
;var32=0x56781234
對地址直接操作可使用:[]
如:獲取ESI地址數據 mov var,[esi]
myArray WORD 10,20,30,40,50
MOV ESI, OFFSET myArray ;ESI指向數組地址
mov AX,[ESI] ;AX=0x000a
ADD ESI, 2
mov AX,[ESI] ;AX=0x0014
指針均是4個字節,定義如下:
arrayB BYTE 10h,20h,30h,40h
ptrB DWORD arrayB
TYPEDEF:定義類型
PBYTE TYPEDEF PTR BYTE ;類似BYTE*
LOOP:循環
mov AX,0
mov ECX,5 ;循環次數
L1:
inc ax
call DumpRegs
Loop L1
JMP:跳轉,注意跳轉結構
總結:
疼痛只是臨時的,很快就會過去;但是對自己的“仁慈”卻可能導致自己以後一生的後悔。