汇编指令简单指令简介
计算机是通过执行指令来处理各种数据的。为了指出数据的来源、操作结果的去向及所执行的操作,一条指令必须包含下列信息:
(1)操作码。它具体说明了操作的性质及功能。一台计算机可能有几十条至几百条指令,每一条指令都有一个相应的操作码,计算机通过识别该操作码来完成不同的操作。
(2)操作数的地址。CPU通过该地址就可以取得所需的操作数。
(3)操作结果的存储地址。把对操作数的处理所产生的结果保存在该地址中,以便再次使用。
(4)下条指令的地址。
一条指令实际上包括两种信息即操作码和地址码。操作码(OperationCode,OP)用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数。地址码用来描述该指令的操作对象,它或者直接给出操作数,或者指出操作数的存储器地址或寄存器地址(即寄存器名)。
指令包括操作码域和地址域两部分。根据地址域所涉及的地址数量,常见的指令格式有以下几种。
①三地址指令:一般地址域中A1、A2分别确定第一、第二操作数地址,A3确定结果地址。下一条指令的地址通常由程序计数器按顺序给出。
②二地址指令:地址域中A1确定第一操作数地址,A2同时确定第二操作数地址和结果地址。
③单地址指令:地址域中A 确定第一操作数地址。固定使用某个寄存器存放第二操作数和操作结果。因而在指令中隐含了它们的地址。
④零地址指令:在堆栈型计算机中,操作数一般存放在下推堆栈顶的两个单元中,结果又放入栈顶,地址均被隐含,因而大多数指令只有操作码而没有地址域。
⑤可变地址数指令:地址域所涉及的地址的数量随操作定义而改变。如有的计算机的指令中的地址数可少至 0个,多至6个。
mov指令解析
列如 mov ax,cx 89c8 1000 1001 1100 1000
Xxxx xxxx(前八位表示指令) xx(表寻址方式) xxx(操作数2 bx)xxx(操作数1 ax)
表寻址方式:
11表示两个寄存器 后面跟着两个操作数 其他的和后面三位配合表示寻址方式
00 表示内存到寄存器
01 表示内存加寄存器+16位
10 表示内存到寄存器+64位
数据传送指令
Mov 无法内存到内存的传送
一般传送都需要一个为寄存器
Mov al , byte ptr ds:[200h]
告诉编译器区多大
Mov ax ,ds:[200H]
必须明确寄存器的位置
Xchg 两数交换
Xchg ax,bx
换码指令
Xlat(等价于下标寻址)
Table db ‘a’ , ‘b’,’c’
Mov bx,offset Table
Mov al,0
Xlat ; al= 61H
为什么要入栈,寄存器不够用
Push 入栈
Pop 出栈
假设栈顶为1000h 栈的位置就是0ffe 00 00 两个字节用作传参
站必须在模16的位置
Sub sp,2
Push ax =》 mov bx , sp
Mov [bx],ax
Mov bx, sp
Pop ax =》 mov ax ,[bx]
Add sp ,2
程序为了兼容,执行最后保存环境
Push axpop ax
Pushf popf
保存标志恢复标志
Lahf 加载ah到flag 读取
Sahf 存储ah到flag 写入
只能修改低位 重要标志位都在低位
Lea 地址传送(用来做运算块)
多数用于加法和乘法
Lea ax, ds:[bx + 200h];ax = bx + 200h
Lea ax, ds:[bx + 200h*8];ax = bx + 200h*8
Les 切换段寄存器 es
Lds 切换段寄存器 ds
In out指令 特权指令
可以控制地址总线的输入和输出
现在的系统都已经禁止此命令
复杂指令集 inter amd
精简指令集 arm
分配段控件
Debug调试器中
Mov ax,1000
Mov ds, ax
Mov es, ax (将数据和附加数据段放在一起)
可以分配其他空间,但是代码段是程序一开始就分配好的,改变不了,改变了后,系统会发现对应的地方无效操作码系统会崩
无法控制代码加载到内存的位置,所以将内存分段交给操作系统。
可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下,可执行程序的呈现方式不一样。
Test指令
Test ax, 8000h ; 与ax做与运算 ax的值不变
Test ax , ax ;判断是否为零 指令周期最快
Test ax , 1 ;判断标志位 影响 zf 标志位
Rol 左循环位移高位放到cf 和最低位
Ror 右循环位移低位放到高位和cf
mov ax , 0ffeeh
mov cl , 8 (次数)
rol ax , cl ;结果 ax = 0eeffh
带进位的循环移位 32位的移位 将高位放在cf中寄存
Rcl带进位的左循环移位
Rcr带进位的右循环移位
32位移位
Shl ax,1
Rcl ax, 1
Shr ax,1
Rcr ax,1
压缩到不压缩不压缩到压缩
Ax = 00ffh ax= 0f0fh
And al,0fhAxd al,0fh
Mov ah,al Shl ah,4
And ah,0f0hOr al,ah
Shl ah,4
串操作指令
Cld指令后 df = 0 地址加 df方向标志位
STD,将方向标志位DF置1
Movs 把字节操作数从源地址传送到目的地址
Mov si ,offset SI
Mov di ,offset DI
Mov cx,4
;没有rep指令 一般都是repz
Repz 2个周期指令
Movsb拷贝一个字节
Movsw拷贝两个字节 在后面继续拷贝
串存储STOS
把AL或AX数据传送至目的地址
STOSB 字节串存储:ES:[DI]←AL
STOSW 字串存储:ES:[DI]←AX
串读取LODS 用于比较
把指定主存单元的数据传送给AL或AX
LODSB 字节串读取:AL←DS:[SI]
LODSW 字串读取:AX←DS:[SI]
串比较CMPSmemcpy
将主存中的源操作数减去至目的操作数,以便设置标志,进而比较两操作数之间的关系
CMPSB 字节串比较:DS:[SI]-ES:[DI]
CMPSW字串比较:DS:[SI]-ES:[DI]
串扫描SCASstrlen
将AL/AX减去至目的操作数,以便设置标志,进而比较AL/AX与操作数之间的关系
SCASB字节串扫描:AL-ES:[DI]
SCASW 字串扫描:AX-ES:[DI]
REP重复前缀指令
REP每执行一次串指令,CX减1
直到CX=0,重复执行结束
REP前缀可以理解为:当数据串没有结束(CX≠0),则继续传送
REPZ每执行一次串指令,CX减1相等重复
(需要将并判断ZF是否为0,
cx走完)只要CX=0或ZF=0,重复执行结束
REPNZ 每执行一次串指令,CX减1不相等重复
(cx可以 并判断ZF是否为1,
提前结束) 只要CX=0或ZF=1,重复执行结束
无条件转移指令
JMP/Jcc/LOOP CALL/RET
JMP指令分成4种类型:
⑴ 段内转移、直接寻址
⑵ 段内转移、间接寻址
⑶ 段间转移、直接寻址
⑷ 段间转移、间接寻址
段内转移 同一段中跳转
汇编中没有 jmp TABLE(标号) 是宏编译器帮忙识别添加short 和near
Jmp又称伪指令
段内转移——近转移(near)jmp near ptr TABLE( 标号 )e9表示跳转
在当前代码段64KB范围内转移( ±32KB范围)
不需要更改CS段地址,只要改变IP偏移地址
段内转移——短转移(short)jmp short TABLE( 标号 ) eb表示跳转
转移范围可以用一个字节表达,在段内-128~+127范围的转移
段间转移 不同段相互跳转操作
jmp far ptr TABLE( 标号 )ea表示跳转 前四个表ip 后四个表段
段间转移——远转移(far)
从当前代码段跳转到另一个代码段,可以在1MB范围
需要更改CS段地址和IP偏移地址
目标地址必须用一个32位数表达,叫做32位远指针,它就是逻辑地址
~~~花指令 90 给一个字节的指令来解花指令
Edit 编辑器
注释 ; 或者/**/
Mystack segment stack
Db 256 dup(?)
;Db定义数据类型 dup初始化内存 ?随机 0 全为0
Mystack ends
Mydate segment
;Db 256 dup(?) 如果不写就是默认写的字节数大小
MSG db”hello world$”
Mydate ends
Mycode segment
START ; (程序入口 告诉计算机执行代码开始处)
Mov ax,Mydate (标识代表位置)
Mov ds,ax
Mov es,ax
Mov ax,Mystack
Mov ss,ax
Mov ah,09h
Mov dx,offset MSG ;offset自动算数据区偏移
Int 21
;exit 系统写的特殊退出码
Mov ax,04c00h
Int 21
Mycode ends
End START
;end 告诉编译器结束了
计算机是通过执行指令来处理各种数据的。为了指出数据的来源、操作结果的去向及所执行的操作,一条指令必须包含下列信息:
(1)操作码。它具体说明了操作的性质及功能。一台计算机可能有几十条至几百条指令,每一条指令都有一个相应的操作码,计算机通过识别该操作码来完成不同的操作。
(2)操作数的地址。CPU通过该地址就可以取得所需的操作数。
(3)操作结果的存储地址。把对操作数的处理所产生的结果保存在该地址中,以便再次使用。
(4)下条指令的地址。
一条指令实际上包括两种信息即操作码和地址码。操作码(OperationCode,OP)用来表示该指令所要完成的操作(如加、减、乘、除、数据传送等),其长度取决于指令系统中的指令条数。地址码用来描述该指令的操作对象,它或者直接给出操作数,或者指出操作数的存储器地址或寄存器地址(即寄存器名)。
指令包括操作码域和地址域两部分。根据地址域所涉及的地址数量,常见的指令格式有以下几种。
①三地址指令:一般地址域中A1、A2分别确定第一、第二操作数地址,A3确定结果地址。下一条指令的地址通常由程序计数器按顺序给出。
②二地址指令:地址域中A1确定第一操作数地址,A2同时确定第二操作数地址和结果地址。
③单地址指令:地址域中A 确定第一操作数地址。固定使用某个寄存器存放第二操作数和操作结果。因而在指令中隐含了它们的地址。
④零地址指令:在堆栈型计算机中,操作数一般存放在下推堆栈顶的两个单元中,结果又放入栈顶,地址均被隐含,因而大多数指令只有操作码而没有地址域。
⑤可变地址数指令:地址域所涉及的地址的数量随操作定义而改变。如有的计算机的指令中的地址数可少至 0个,多至6个。
比如 mov ax,cx 89c8 1000 1001 1100 1000
Xxxx xxxx(前八位表示指令) xx(表寻址方式) xxx(操作数2 bx)xxx(操作数1 ax)
表寻址方式:
11表示两个寄存器 后面跟着两个操作数 其他的和后面三位配合表示寻址方式
00 表示内存到寄存器
01 表示内存加寄存器+16位
10 表示内存到寄存器+64位
复杂指令集 inter amd
精简指令集 arm
分配段控件
Debug调试器中
Mov ax,1000
Mov ds, ax
Mov es, ax (将数据和附加数据段放在一起)
可以分配其他空间,但是代码段是程序一开始就分配好的,改变不了,改变了后,系统会发现对应的地方无效操作码系统会崩
无法控制代码加载到内存的位置,所以将内存分段交给操作系统。
可执行文件 (executable file) 指的是可以由操作系统进行加载执行的文件。在不同的操作系统环境下,可执行程序的呈现方式不一样。
Edit 编辑器
注释 ; 或者/**/
Mystack segment stack
Db 256 dup(?)
;Db定义数据类型 dup初始化内存 ?随机 0 全为0
Mystack ends
Mydate segment
;Db 256 dup(?) 如果不写就是默认写的字节数大小
MSG db”hello world$”
Mydate ends
Mycode segment
MJ ; (程序入口 告诉计算机执行代码开始处)
Mov ax,Mydate (标识代表位置)
Mov ds,ax
Mov es,ax
Mov ax,Mystack
Mov ss,ax
Mov ah,09h
Mov dx,offset MSG;offset自动算数据区偏移
Int 21
;exit 系统写的特殊退出码
Mov ax,04c00h
Int 21
Mycode ends
End MJ
;end 告诉编译器结束了
寻址会极大的降低性能