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:跳转,注意跳转结构


总结:
疼痛只是临时的,很快就会过去;但是对自己的“仁慈”却可能导致自己以后一生的后悔。

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