數據類型與數據傳送指令
數據類型、數據傳送指令、間接尋址
一、數據類型
數據類型的基本特徵是以數據爲的數目度量的大小,其他特徵主要是爲了方便程序員記憶變量中存儲的數據類型,默認情況下大小寫不敏感。
類型 | 描述 |
---|---|
BYTE | 8位無符號 |
SBYTE | 8位有符號 |
WORD | 16位無符號 |
SWORD | 16位有符號 |
DWORD | 32位無符號 |
SDWORD | 32位有符號 |
FWORD | 48位整數 |
QWORD | 64位整數 |
TBYTE | 80位整數 |
REAL4 | 32位短實數 |
REAL8 | 64位長實數 |
REAL10 | 80位擴展實數 |
遺留數據定義僞指令
類型 | 描述 |
---|---|
DB | 8位整數 |
DW | 16位整數 |
DD | 32位整數或實數 |
DQ | 64位整數或實數 |
DT | 定義10字節 |
數據定義語句:
[變量名] 數據定義僞指令 初始值[,初始值]...
有多個初始值的話,用逗號隔開;未初始化,用?代替初始值。
bigArr DWORD 500 DUP(?)
二、數據傳送指令
指令中的操作數的描述及其表述
1、操作數類型:
立即操作數(immediate)
寄存器操作數(register)
內存操作數(memory)
操作數 | 描述 |
---|---|
r8 | 8位通用寄存器: |
r16 | 16位通用寄存器: |
r32 | 32位通用寄存器: |
reg | 任意的通用寄存器 |
sreg | 16位段寄存器: |
imm | 8位、16位或32位立即數 |
imm8 | 8位立即數(字節) |
imm16 | 16位立即數(字) |
imm32 | 32位立即數(雙字) |
r/m8 | 8位操作數(可以是8位通用寄存器或內存字節) |
r/m16 | 16位操作數(可以是16位通用寄存器或內存字節) |
r/m32 | 32位操作數(可以是32位通用寄存器或內存字節) |
mem | 8位、16位或32位操作數 |
2、基本命令
mov destination,source 從源操作數向目的操作數幅值數據
movzx(move with zero-extend)零擴展傳送,將源操作數的內容複製到目的操作數中,並將該值零擴展至16位或32位。只能用於無符號整數,目的操作數只能是寄存器。
movezx r32 r/m8
movezx r32 r/m16
movezx r16 r/m8
movsx(move with sign-extend)符號擴展傳送,將源操作數的內容複製到目的操作數中,並將該符號零擴展至16位或32位。只能用於有符號整數,目的操作數只能是寄存器。
movesx r32 r/m8
movesx r32 r/m16
movesx r16 r/m8
LAHF:將ELFAGS寄存器的低字節複製到AH寄存器,無操作數
SAHF:將AH寄存器的值複製到ELFAGS寄存器的低字節,無操作數
XCHG:交換兩個操作數的值,不接受立即數操作數
XCHG reg,reg
XCHG reg,mem
XCHG mem.reg
直接偏移操作數:在變量名稱後加上一個偏移值,可以創建直接偏移操作數,來訪問沒有顯式標號的內存地址。
arrayW WORD 100h,200h,300h
mov ax [arrayW+2];AX = 200H
3、加法和減法
INC/DEC:從操作數中加1或減1
INC reg/mem
DEC reg/mem
ADD:將尺寸相同的源操作數和目的操作數相加,結果保存在目的操作數中
ADD 目的操作數,源操作數
SUB:將尺寸相同的源操作數和目的操作數相加,結果保存在目的操作數中
SUB 目的操作數,源操作數
NEG:將數字轉換成補碼求相反數
NEG reg/mem
4、相關操作符和僞指令
OFFSET,返回變量相對於其所在段開始的偏移
PTR,允許重載變量的默認尺寸
TYPE,返回數組中每個元素的大小(字節)
LENGTH,返回數組內元素的數目
SIZEOF,返回數組初始化時佔用的字節數
三、間接尋址
處理數組唯一可行的方法是用寄存器作爲指針並操縱寄存器的值,這稱爲間接尋址。操作數使用間接尋址時,就稱爲間接操作數。
constant[reg]
[constant + reg]
arrayW WORD 100h,200h,300h
mov esi,0
mov al,[arrayW + esi]
mov al,arrayW[0]
比例因子
array DWORD 100h,200h,300h,400h
mov esi,3*BYTE array ;array[3]的偏移地址
mov eax,[esi] ;eax=400h
mov esi,3 ;下標
mov eax,array[esi*3] ;eax=400h