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:跳转,注意跳转结构
总结:
疼痛只是临时的,很快就会过去;但是对自己的“仁慈”却可能导致自己以后一生的后悔。