x86汇编指令详细学习(会更新)

刚学习汇编,菜鸟一个。记下学习笔记

mov指令:
mov 目标操作数,源操作数; (类似c语言的等于号)
拷贝 源操作数 到 目标操作数。
例如 mov eax,ebx
前后的位数(宽度)必须是相同的,8位对应8位,16对应16, 32位对应32位。
(汇编有三种操作数:寄存器操作数,存储器操作数,立即数。寄存器操作数就是寄存器中的数,存储器操作数就是内存单元中的数,立即数类似高级语言的常量)。
如果源操作数是立即数 ,写的不是对应的宽度, 会在前面自动补0。
例如 mov ax,0x1 实际 是 0x0001
源 和 目标 不能同时是 内存单元。
目标操作数是 存储器操作数(即内存单元时) 应该注明要操作的大小 例如 mov word/dword ptr ds:[内存地址],源操作数。 word 可以换成 byte,dword,(dword是32位,word是16位,byte是8位)

几种寻址方式: [ ]内 可以是 立即数,8种通用寄存器,8种寄存器加立即数,8种寄存器×1或者2或者4 (只能是1或者2或者4),或者8种寄存器×1或者2或者4 再加上立即数。

mov指令不改变标志寄存器的值

add 指令 和 sub 指令:
前后的宽度可以不一样。

and 指令 ,or 指令 ,xor指令:
将数字转化为二进制,对应的位( 每个位)进行 and,or 运算。
and 只有都是 1 结果才是1,or 只要有一个为1,结果就是1 。

lea(load effect address的缩写)指令 :
取地址, lea ax,dword ptr ds:[内存地址] ,是将这个内存地址送到 ax 中。

inc (increase的缩写)自增 dec (decrease的缩写) 自减
类似 c语言 自增自减 inc ax就是 ax加1(十进制)

push指令 pop指令
push r32/r16/m16/m32/imm8/imm16/imm32 (立即数可以是8位的) (r为寄存器,m为内存)

pop  r32/r16/m16/m32

push或者pop一个立即数,则esp减或者加 4,
如果 push ,pop 后面跟的是一个容器(比如寄存器),ESP要根据容器的宽度减,比如 push ax,则 esp减2., 或者push dword ptr ds:[address] 则esp减4。

pushad 和popad指令
pushad 是将八个通用寄存器的值放到堆栈中。
popad将存在堆栈中的八个寄存器的值恢复给8个通用寄存器。

ADC指令(带进位的加法指令,c是carry)。
相当于 add 目标操作数,源操作数+CF标志的值
目标和源不能同时是内存单元,两天宽度得相等
SBB指令(带借位的减法,B是borrow)
相当于 sub 目标,源+CF (不能同时是内存单元,宽度得相同)
XCHG指令 (交换目标和源的值)
两边得是容器,两边可以同时是内存单元。
MOVS指令
类似mov指令 两边可以是内存单元,但是宽度必须一样。

MOVS word ptr ds:[edi],word ptr ds:[esi] 

可以缩写为 MOVSW
一个字节的 可以缩写为 MOVSB
双字的可以缩写为 MOVSD。
执行后,edi 和esi 分别 加 或者减 (根据DF标志,如果DF是0则加,DF为1则减)字节数,如果是word 就加或者减 2,byte 就是1 dword 就是4.
STOS(store string data)指令
将AL, AX, EAX中的值存到 存到 es:di 中,需要指明 宽度。执行后会根据 DF标志 ,edi 的值 会增加或者减少。
CMP(compare)指令
cmp指令相当于减法,但是运算结果并不保存。
例如 cmp ax,bx 相当于 ax-bx ,但是减后的结果不并保存(即ax的值不变),但是运算结果会影响标志寄存器的值,通过标志寄存器的值判断两者的大小关系。
test 指令 。
按位(化为二进制数后)进行 and运算(结果并不保存,但是会影响标志寄存器的值)。
常用来判断 某个寄存器的值是否是0.
例如 test ax,ax如果ax 是0,则 ZF位是1.

猜你喜欢

转载自blog.csdn.net/qq_43394612/article/details/83934516