8086汇编笔记01

reg/sreg

reg:寄存器

reg的集合包括:ax,bx,cx,dx,ah,al,bh,bl,ch,cl,dh,dl,sp,bp,si,di

sreg:段寄存器

sreg的集合包括:ds,ss,cs,es

bx,si,di,bp

  • 在8086CPU中,只有这4个寄存器(bx,bp,si,di)可以用在[…]中来进行内存单元的寻址
    • 正确的指令形式:mov ax,[bx] mov ax,[bx+si]
    • 错误的指令形式:mov ax,[cx] mov ax,[ax]
  • […]中这4个寄存器可以单个出现,或只能以四种组合出现:bx和si、bx和di、bp和si、bp和di
    • 错误的用法:mov ax,[bx+bp] mov ax,[si+di]
  • 只要在[…]中使用寄存器bp,而指令中没有显性的给出段地址,段地址就默认在ss中

数据的位置

汇编语言用三个概念来表示数据的位置

  • 立即数(idata)
    • 对于直接包含在机器指令中的数据(执行前在CPU的指令缓冲器中),例如mov ax.1中的1即为立即数
  • 寄存器
  • 段地址(SA)和偏移地址(EA)
    • 存放段地址的寄存器可以是默认的
      • 默认在ds中的场景
        • mov ax,[0]
        • mov ax,[bx]
        • mov ax,[bx+8]
        • mov ax,[bx+si]
        • mov ax,[bx+si+8]
      • 默认在ss中的场景
        • mov ax,[bp]
        • mov ax,[bp+8]
        • mov ax,[bp+si]
        • mov ax,[bp+si+8]
    • 存放段地址的寄存器也可以显性的给出
      • mov ax,ds:[bp]
      • mov ax,es:[bx]
      • mov ax,ss:[bx+si]
      • mov ax,cs:[bx+si+8]

数据的长度

8086CPU的指令可以处理两种尺寸的数据,字节(byte)和字(word),所以在机器指令中要指明,指令进行的是字操作还是字节操作,在32位处理器中还引入了双字(double word),在64位处理器还引入了四字

  • 通过寄存器名指明要处理的数据的尺寸
    • 指明了是字(word)操作
      • mov ax,1
      • mov bx,ds:[0]
      • mov ds,ax
      • mov ds:[0],ax
      • inc ax
      • add ax,1000
    • 指明了是字节(byte)操作
      • mov al,1
      • mov al,bl
      • mov al,ds:[0]
      • mov ds:[0],al
      • inc al
      • add al,100
  • 在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在8086汇编指令中可以为word或byte
    • 用word ptr指明访问字(word)单元
      • mov word ptr ds:[0],1
      • inc word ptr [bx]
      • inc word ptr ds:[0]
      • add word ptr [bx],2
    • 用byte ptr指明访问字节(byte)单元
  • 其他方法
    • 有些指令默认了访问的是字节(byte)或字(word)
      • push指令只进行字(word)操作:push [1000H]

结构化访问数据

一般来说我们可以用[bx+idata+si]的方式来进行访问结构体中的数据

  • 用bx定位整个结构体
  • 用idata定位结构体中的某一个数据项
  • 用si定位数组项中的每个元素

所以也可以使用更方便的写法,例如:[bx].idata [bx].idata[si]

div

div是除法指令(division),使用div作除法的时候

  • 除数:8位或16位,在寄存器或内存单元中
  • 被除数:(默认)放在AX或DX和AX中
除数 被除数
8位 16位(AX)
16位 32位(DX+AX)
运算 8位 16位
AL AX
余数 AH DX

div指令格式:

  • div reg
  • div 内存单元
    • div byte ptr ds:[0]
    • div word ptr es:[0]

db、dw、dd

db

db在汇编中表示一个byte,就是一个字节8位,每次读取数据时,读完一个偏移量加1

dw

dw在汇编中表示一个字(word),就是两个字节16位,每次读取数据时,读完一个偏移量加2

dd

dd在汇编中表示一个双字,就是四个字节32位,每次读取数据时,读完一个偏移量加4

dup

dup和db、dw、dd等数据定义伪指令配合使用的,来进行数据的重复

  • db 重复的次数 dup (重复的字节型数据)
  • dw 重复的次数 dup (重复的字型数据)
  • dd 重复的次数 dup (重复的双字型数据)

示例

  • db 3 dup(0)
    • 定义了3个字节,他们的值都是0,相当于db 0,0,0
  • db 3 dup(0,1,2)
    • 定义了9个字节,他们的值是(0,1,2,0,1,2,0,1,2),相当于db 0,1,2,0,1,2,0,1,2
  • db 3 dup(‘abc’,‘ABC’)
    • 定义了18个字节,他们的值是(‘abcABCabcABCabcABC’),相当于db ‘abcABCabcABCabcABC’

猜你喜欢

转载自blog.csdn.net/kelxLZ/article/details/111129172