隔了好久重学已经忘的差不多的汇编
1.通用寄存器:ax,bx,cx,dx
2.8086CPU中这四个16位寄存器都是可以分为独立使用的8位寄存器:比如ax可以分为ah(高八位)和al(低八位)
3.字节(byte):一个字节由8bit组成,存在8位寄存器中
字(word):可以存在一个十六位寄存器中,一个字由两个字节构成,分别为这个字的高位字节和地位字节
4.段寄存器:cs,ds,ss,es
5.cs(代码段寄存器)和ip(指针指令寄存器)
CPU将cs:ip指向的内容当作指令来执行
jmp指令:可以简单的修改cs,ip的值
例如:jmp 2AE3:3,执行后cs=2AE3H,ip=0003H,CPU将从2AE33H处执行指令
或者,jmp 某一合法寄存器(jmp ax):用寄存器中的值来修改ip的值
6.ds和[address]
ds存放了数据的段地址
例如:mov bx,1000H
mov ds,bx
mov al,[0]
上面指令将10000H中的数据读入al中
指令执行时,自动取ds中的数据位内存单元的段地址 , [..]中的数字表示内存单元的偏移地址
[bx]同样表示一个内存单元,偏移地址在bx中
mov ax,[bx]
不支持直接将数据送入段寄存器中
除此之外还可以用更灵活的方式指明内存单元:[bx+idata],[bx+si],[bx+di],[bx+si+idata]
在8086CPU中,只有这四个寄存器可以在[...]进行内存单元的寻址:bx,si,di,bp
只有在[...]中使用寄存器bp,而指令中没有给出段地址,段地址就默认在ss中
还有更贴切的书写方式:[bx].idata,[bx].idata[si]
7. ss(存放栈顶的段地址)和sp(偏移地址)
一般来说,在需要暂存数据时,我们都需要使用栈
push指令执行步骤:a. sp=sp-2,b.像ss:sp指向的字单元送入数据
pop:a. 向ss:sp中字单元读取数据 b. sp=sp+2
8. inc bx:bx中的内容加1
dec bx:bx中的内容减1
9. loop:a.cx=cx-1, b.判断cx的值,不为0则执行程序,cx存放循环次数
10. dw(define word):字型数据,占一个字节
dd(double world):双字型数据,占一个字
db(define byte):字节型数据,占2个字
dup:配合这些伪指令使用,用来进行数据的重复
db 3 dup (0):定义了三个字节,他们的值都是0,相当于0,0,0
11. and(按位进行与计算)
将al第六位设为0:and al,10111111B
or(按位进行或计算)
将al的第六位设为1:or al,01000000B
12.si和di:和bx相近的寄存器,不能分为两个8位的寄存器
mov si,0
mov ax,[si]
13. word ptr指明了指令访问的内存单元是一个字单元
byte ptr则是一个字节单元
14.offset:取得标号的偏移地址
15.jcxz(有条件转移指令):如果cx=0,转移到标号处执行
16. ret:用栈中的数据,修改ip的内容,从而实现近转移
retf:用栈中的数据,修改cs和ip的内容,从而实现远转移