Assembly Language
寄存器:
通用寄存器数据寄存器:
AX Accumulator 累加器
BX Base 基址寄存器
CX Count 计数器
DX Data 数据寄存器指针寄存器:
BP Base Pointer 基址指针寄存器
SP Stack Pointer 栈指针寄存器变址寄存器:
SI Source Index 源变址寄存器
DI Destination Index 目的变址寄存器
控制寄存器
IP Instruction Pointer 指令指针寄存器
FLAG 标志寄存器
段寄存器:
CS Code Segment 代码段寄存器
DS Data Segment 数据段寄存器
SS Stack Segment 栈段寄存器
ES Extra Segment 段寄存器
寄存器的组合:
CS:IP 当前指令执行位置
SS:SP 当前栈顶位置
跳转指令:
段内跳转:
jmp short Label 8 bit 短跳转
jmp near ptr Label 16 bit 近跳转
jmp 寄存器 16 bit 跳转
jmp word [存储器地址] 16 bit 跳转
端间跳转:
jmp far ptr Label 段地址, 偏移值直接由 Label 指出
jmp dword ptr [存储器地址] 段地址, 偏移值有存储器中的值决定
开辟存储空间:
开辟空间指令是伪指令, 并不在执行期间被执行, 而是在汇编期间由汇编程序处理的操作.
; Lable db/dw/dd/dq/dt [数量] 内容和形式 ; 长度
arr8 db 00h, 01h ; 2 bytes
arr16 dw 0000h, 0001h ; 4 bytes
arr32 dd 10 dup(?) ; 40 bytes
arr64 dq 10 dup(0h, 2 dup(1h, 2h), 0h) ; 480 bytes
arr80 dt 10 00h ; 100 bytes; 对同一地址不同解释arr_byte label byte ; 以字节方式解释arr_word dw 50 dup(?) ; 以字的方式开辟 100 bytes 空间
赋值
赋值指令是伪指令.
CONSTANT equ 10h
ARR_LEN equ ARR_END - ARR_BEGIN ; 'ARR_END' 和 'ARR_BEGIN' 必须出现在 'ARR_LEN' 之前
VAR = 43h ; 'equ' 与 '=' 的区别在于前者不可重复定义一个标签, 而后者可以
VAR = 12h
栈操作
push AX pop BX
; SP = SP - 2 先准备栈空间 ; BX = word(SP) 先将值保存至目标位置
; word(SP) = AX 再将值写入栈 ; SP = SP + 2 再将栈顶后移(出栈)
函数调用与返回
call DST ret [DST]
; [CS 入栈] ; IP = (SP)
; IP 入栈 ; IP 出栈
; [ CS = CS + DST段地址 ] ; [ CS = (SP) ]
; IP = IP + DST偏移量 ; [ CS 出栈 ]
; [ SP = SP + DST ]
中断与中断返回
中断向量表位置 : 00000h ~ 003FFh, 共占 1024 字节. 可存储 256 个中断向量. 高地址存放 CS, 低地址存放 IP.
int TYPE iret
; PSW 入栈 ; IP = word(SP)
; CS 入栈 ; IP 出栈
; IP 入栈 ; CS = word(SP)
; IP = (TYPE * 4) ; CS 出栈
;CS = (TYPE * 4 + 2) ; PSW = word(SP)
; PSW 出栈
$ 为当前地址计数器的值(当前段的偏移值).