2010-7-28 ASM Base Element

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:跳轉,注意跳轉結構


總結:
疼痛只是臨時的,很快就會過去;但是對自己的“仁慈”卻可能導致自己以後一生的後悔。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章