汇编学习--(1)

隔了好久重学已经忘的差不多的汇编

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的内容,从而实现远转移

猜你喜欢

转载自blog.csdn.net/qq_41007744/article/details/82875194