最近学习了X86汇编,其实无论是古老的8086还是现在i3/5/7/9,Xeon3/5,在最基本原理上,都是相通的,只是CPU位数,寻址空间,寄存器个数,指令集的扩充等方面有所不同,对于学习,8086永不过时。

数据:

[bx]:eg. mov ax,[bx],表示bx寄存器中的数据作为一个偏移地址EA,段地址SA默认在D中,将SA:EA内存单元中的数据存入AX

x ptr: x表示:word、byte,eg. mov word ptr ds:[0],1

start标号:指定程序运行起始地址

伪指令:

1.segment...ends伪指令

格式: XXX segment ;定义一个一个段开始,名称为XXX XXX ends ;定义一个段结尾,名称为XXX 释义:segment...ends指令对,定义一个段XXX。

2.end

释义:end是一个汇编程序结束的标志。

3.assum

释义:表示假设,它假设某一段寄存器和程序中的某一个sgment...ends定义的段相关联,上面示例assume cs:codesg就是将代码段codesg和CPU中的段寄存器cs联系起来。

4.数据定义伪指令

dw:定义数据类型,定义字型数据,如:dw 0123H, 0456H, 0789H db:定义ASCII码数据,eg. db 'unix' dd:定义双字型数据 dup:数据复制,db 3 dup (0),定义三个字节,都是0,相当于:db 0,0,0

指令:

1.mov指令

释义:数据传送指令 mov 寄存器, 数据 mov 寄存器,寄存器 mov 寄存器,内存单元 mov 内存单元,寄存器 mov 段寄存器,寄存器 mov 寄存器,段寄存器 mov 段寄存器,内存单元

2.add指令

释义:加法指令 add 寄存器, 数据 add 寄存器,寄存器 add 寄存器,内存单元 add 内存单元,寄存器

3.sub指令格

释义:减法指令 sub 寄存器, 数据 sub 寄存器,寄存器 sub 寄存器,内存单元 sub 内存单元,寄存器

4.push指令

释义:压栈指令 push 段寄存器 push 内存地址

5.pop指令

释义:出栈指令 pop 寄存器 pop 段寄存器 pop 内存地址

6.loop指令

释义:循环指令,判断(cx) = (cx) - 1,如果cx的值不为0就跳转到s,如果为0就执行下一条指令。 loop 标号

7.and指令

释义:逻辑与指令,按位进行与计算 and al,立即数

8.or指令

释义:逻辑或指令,按位进行或指令 or ax,立即数

9.div指令

释义:除法指令,除数有8位或16位两种,在一个reg或内存单元中,被除数默认放在AX或DX和AX中,如果除数位8位,被除数则为16位,放在AX中,如果除数位16位,则被除数位32位,在DX和AX中存放,DX存放高16位,AX存放低16位,对于结果,如果除数位8位,则AL作为商,AH存放余数,如果除数位16位,AX作为商,DX存放余数。 div reg div [...] div byte ptr ds:[0] 含义:(al) = (ax)/((ds)*16 + 0) 的商 (ah) = (ax)/((ds)*16 + 0) 的余数

10.mul指令

释义:乘法指令,注意两点: (1)两个乘数,要么都是8位,要么都是16位。如果是8位,一个默认放在AL,另一个放在8位寄存器或内存字节单元中;如果是16位,一个默认在AX中,另一个放在16位寄存器或内存字单元中。 (2)结果:如果是8位乘法,结果放在AX中,如果是16位乘法,结果高位默认存在DX中,低位在AX中。 mul reg mul [...]

11.adc指令

释义:带进位加法指令,它利用了CF标志位 adc 操作对象1, 操作对象2 功能:操作对象1 = 操作对象1 + 操作对象2 + CF

12.sbb指令

释义:带借位减法指令 sbb 操作对象1, 操作对象2 功能:操作对象1 = 操作对象1 - 操作对象2 - cf

13.cmp指令

释义:比较指令 cmp 操作对象1, 操作对象2

14.条件转移指令

je:等于则转移,检测标志位:zf=1 jne:不等于则转移,检测标志位:zf=0 j和b:小于则转移,检测标志位:cf=1 (无"和",主要是防止敏感词问题,博客审核不过) jnb:大于等于则转移,检测标志位:cf=0 ja:大于则转移,检测标志位:cf=0且zf=0 jna:小于等于则转移,检测标志位:cf=1或zf=1

15.inc指令

指令格式: inc reg inc ax ; ax值自增1,相关于C语言的++