1、数据传输指令
MOV ;传送字或字节
MOVSX ;先符号扩展,再传送
MOVZX ;先零扩展,再传送
PUSH ;把字压入堆栈
POP ;把字弹出堆栈
PUSHA ;把AX,CX,DX,BX,SP,BP,SI,DI依次压入堆栈
POPA ;把DI,SI,BP,SP,BX,DX,CX,AX依次弹出堆栈
PUSHAD ;把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI依次压入堆栈
POPAD ;把EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX依次弹出堆栈
BSWAP ;交换32位寄存器里字节的顺序
XCHG ;交换字或字节.( 至少有一个操作数为寄存器,段寄存器不可作为操作数)
CMPXCHG ;比较并交换操作数.( 第二个操作数必须为累加器AL/AX/EAX )
XADD ;先交换再累加.( 结果在第一个操作数里 )
XLAT ;字节查表转换
;── BX 指向一张 256 字节的表的起点, AL 为表的索引值 (0-255,即
;0-FFH); 返回 AL 为查表结果. ( [BX+AL]->AL )
2、输入输出端口传送指令
IN ;I/O端口输入( 语法: IN 累加器, {端口号│DX} )
OUT ;I/O端口输出( 语法: OUT {端口号│DX},累加器 )
;输入输出端口由立即方式指定时, 其范围是 0-255; 由寄存器 DX 指定时, 其范围是 0-65535
3、目的地址传送指令
LEA ;装入有效地址. 例: LEA DX,string ;把偏移地址存到DX.
LDS ;传送目标指针,把指针内容装入DS. 例: LDS SI,string ;把段地址:偏移地址存到DS:SI.
LES ;传送目标指针,把指针内容装入ES. 例: LES DI,string ;把段地址:偏移地址存到ES:DI.
LFS ;传送目标指针,把指针内容装入FS. 例: LFS DI,string ;把段地址:偏移地址存到FS:DI.
LGS ;传送目标指针,把指针内容装入GS. 例: LGS DI,string ;把段地址:偏移地址存到GS:DI.
LSS ;传送目标指针,把指针内容装入SS. 例: LSS DI,string ;把段地址:偏移地址存到SS:DI.
4、标志传送指令.
LAHF ;标志寄存器传送,把标志装入AH.
SAHF ;标志寄存器传送,把AH内容装入标志寄存器.
PUSHF ;标志入栈.
POPF ;标志出栈.
PUSHD ;32位标志入栈.
POPD ;32位标志出栈.
ADD ;加法,等价于ax += bx
ADC ;带进位加法
INC ;加 1
AAA ;加法的ASCII码调整
DAA ;加法的十进制调整
SUB ;减法
SBB ;带借位减法
DEC ;减 1
NEC ;求反(以 0 减之)
CMP ;比较.(两操作数作减法,仅修改标志位,不回送结果)
AAS ;减法的ASCII码调整
DAS ;减法的十进制调整
MUL ;无符号乘法
IMUL ;整数乘法
;以上两条,结果回送AH和AL(字节运算),或DX和AX(字运算)
AAM ;乘法的ASCII码调整
DIV ;无符号除法
IDIV ;整数除法
;以上两条,结果回送:
;商回送AL,余数回送AH, (字节运算);
;或 商回送AX,余数回送DX, (字运算).
AAD ;除法的ASCII码调整
CBW ;字节转换为字(把AL中字节的符号扩展到AH中去)
CWD ;字转换为双字(把AX中的字的符号扩展到DX中去)
CWDE ;字转换为双字(把AX中的字符号扩展到EAX中去)
CDQ ;双字扩展(把EAX中的字的符号扩展到EDX中去)
1、无条件转移指令 (长转移)
JMP ;无条件转移指令
;jmp 2AE3:3; 等价于 mov CS, 2AE3 mov IP, 3;
;jmp ax; 等价于 mov IP, ax;
CALL ;过程调用
RET/RETF ;过程返回
2、条件转移指令 (短转移,-128到+127的距离内)
( 当且仅当(SF XOR OF)=1时,OP1<OP2 )
JA/JNBE ;不小于或不等于时转移
JAE/JNB ;大于或等于转移
JB/JNAE ;小于转移
JBE/JNA ;小于或等于转移
;以上四条,测试无符号整数运算的结果(标志C和Z)
JG/JNLE ;大于转移
JGE/JNL ;大于或等于转移
JL/JNGE ;小于转移
JLE/JNG ;小于或等于转移
;以上四条,测试带符号整数运算的结果(标志S,O和Z)
JE/JZ ;等于转移
JNE/JNZ ;不等于时转移
JC ;有进位时转移
JNC ;无进位时转移
JNO ;不溢出时转移
JNP/JPO ;奇偶性为奇数时转移
JNS ;符号位为 "0" 时转移
JO ;溢出转移
JP/JPE ;奇偶性为偶数时转移
JS ;符号位为 "1" 时转移
3、循环控制指令(短转移)
LOOP ;CX不为零时循环
LOOPE/LOOPZ ;CX不为零且标志Z=1时循环
LOOPNE/LOOPNZ ;CX不为零且标志Z=0时循环
JCXZ ;CX为零时转移
JECXZ ;ECX为零时转移
4、中断指令
INT ;中断指令
INTO ;溢出中断
IRET ;中断返回
5、处理器控制指令
HLT ;处理器暂停, 直到出现中断或复位信号才继续
WAIT ;当芯片引线TEST为高电平时使CPU进入等待状态
ESC ;转换到外处理器
LOCK ;封锁总线
NOP ;空操作
STC ;置进位标志位
CLC ;清进位标志位
CMC ;进位标志取反
STD ;置方向标志位
CLD ;清方向标志位
STI ;置中断允许位
CLI ;清中断允许位
AND ;与运算.
OR ;或运算.
XOR ;异或运算.
NOT ;取反.
TEST ;测试.(两操作数作与运算,仅修改标志位,不回送结果).
SHL ;逻辑左移.
SAL ;算术左移.(=SHL)
SHR ;逻辑右移.
SAR ;算术右移.(=SHR)
ROL ;循环左移.
ROR ;循环右移.
RCL ;通过进位的循环左移.
RCR ;通过进位的循环右移.
;以上八种移位指令,其移位次数可达255次.
;移位一次时, 可直接用操作码. 如 SHL AX,1.
;移位>1次时, 则由寄存器CL给出移位次数.
;如 MOV CL,04
;SHL AX,CL
DS:SI ;源串段寄存器 :源串变址.
ES:DI ;目标串段寄存器:目标串变址.
CX ;重复次数计数器.
AL/AX ;扫描值
D标志 ;0表示重复操作中SI和DI应自动增量; 1表示应自动减量
Z标志 ;用来控制扫描或比较操作的结束
MOVS ;串传送
;(MOVSB 传送字符, MOVSW 传送字, MOVSD 传送双字)
CMPS ;串比较.
;(CMPSB 比较字符, CMPSW 比较字)
SCAS ;串扫描,把AL或AX的内容与目标串作比较,比较结果反映在标志位.
LODS ;装入串,把源串中的元素(字或字节)逐一装入AL或AX中
;(LODSB 传送字符, LODSW 传送字, LODSD 传送双字)
STOS ;保存串,是LODS的逆过程
REP ;当CX/ECX<>0时重复
REPE/REPZ ;当ZF=1或比较结果相等,且CX/ECX<>0时重复
REPNE/REPNZ ;当ZF=0或比较结果不相等,且CX/ECX<>0时重复
REPC ;当CF=1且CX/ECX<>0时重复
REPNC ;当CF=0且CX/ECX<>0时重复
DW ;定义字(2字节)
PROC ;定义过程
ENDP ;过程结束
SEGMENT ;定义段
ASSUME ;建立段寄存器寻址
ENDS ;段结束
END ;程序结束
1 数据不能直接送入到段寄存器中,需要普通寄存器中转;
2 字在内存中存储时,要用两个连续的内存单元来存放;
3 高地址存放高字节,低地址存放低字节。
CS(Code Segment):代码段寄存器,指明代码的起始地址;
DS(Data Segment):数据段寄存器,指明数据的起始地址;
利用DS:EA存取数据段中的数据。
EA为偏移地址,即有效地址。
; 如果没有指定前缀,一般的数据访问在DS(数据)段
mov ax,[1000]; = mov ax,ds:[1000h]
mov ax,cs:[1000]; 从指定的CS段取出数据。
[1000] ;代表内存中的数据,1000表示内存单元的偏移地址。
SS(Stack Segment):栈段寄存器,指明栈的起始地址(段地址);
ES(Extra Segment):附加段寄存器,指明附加段的起始地址;
FS:附加段寄存器。
GS:附加段寄存器。
CPU只认被CS:IP指向的内存单元中的内容为指令。
SI(Source Index):源变址寄存器可用来存放相对于DS段之源变址指针,在串处理指令中,SI用作隐含的源串地址,默认在DS中。
DI(Destination Index):目的变址寄存器,可用来存放相对于 ES 段之目的变址指针,在串处理指令中,DI用做隐含的目的串地址,默认在ES中。
; 将字符串"welcome to masm!" 复制到后面的数据区中
assume cs:codesg, ds:datasg
datasg segment
db 'welcome to masm!'
db '…………………………………………'
datasg ends
codesg segment
start: mov ax, datasg
mov ds, ax
mov si, 0 ;源变址
mov di, 16 ;目的变址,"welcome to masm!"占16个字节
mov cx, 8 ;si,di为16位寄存器,每次2个字节,共需8次
s: mov ax, [si]
mov [di], ax
add si, 2
add di, 2
loop s
mov ax, 4c00h
int 21h
codesg ends
end start
R:查看、更改CPU寄存器内容;
r # 查看
r ax # 把ax修改为1100
:1100
D:查看内存中的内容;
d 段地址/寄存器:偏移地址 # d 500:100
d 段地址/寄存器:偏移地址 结束偏移地址 # d 500:100 109
E:改写内存中的内容;
e 段地址/寄存器:偏移地址 数据/字符/字符串/机器码 ……
e 段地址/寄存器:偏移地址
U:将内存中的机器指令翻译成汇编指令;
# 查看指定的内存单元中的机器指令和它们所对应的汇编指令。
u 段地址/寄存器:偏移地址
T:执行一条机器指令;
A:以汇编指令的格式在内存中写入一条机器指令。
以汇编指令的形式在内存中写入机器指令。
a 段地址/寄存器:偏移地址
P:自动重复执行循环中的指令,直到循环条件不满足;
G:g 0016,自动执行到CS:16处;
说明:汇编指令部分摘自:https://www.kanxue.com/chm.htm?id=10101&pid=node1001139
原文:https://www.cnblogs.com/chungeyuan/p/11427176.html