8.1

2020-03-22
2020-03-22
3 min read
Hits

  《汇编语言(第3版)》8.1、《零基础入门学习汇编语言》P38

第八章 数据处理的两个基本问题

  为了描述上的简洁,我们将使用两个描述性的符号 reg 来表示一个寄存器,用 sreg 表示一个段寄存器

  1. reg 的集合包括:ax、bx、cx、dx、ah、al、bh、bl、ch、cl、dh、dl、sp、bp、si、di;
  2. sreg 的集合包括:ds、ss、cs、es。

8.1 bx、si、di、bp

  在 8086 CPU 中,只有这 4 个寄存器(bx、bp、si、di)可以用在“[…]”中来进行内存单元的寻址。

  正确的指令

  1. mov ax,[bx]
  2. mov ax,[bx+si]
  3. mov ax,[bx+di]
  4. mov ax,[bp]
  5. mov ax,[bp+si]
  6. mov ax,[bp+di]

  错误的指令:mov ax,[cx]、mov ax,[ax]、mov ax,[dx]、mov ax,[ds]

  在“[…]”中,这 4 个寄存器(bx、bp、si、di)可以单个出现,或只能以四种组合出现

  1. bx 和 si
  2. bx 和 di
  3. bp 和 si
  4. bp 和 di

  错误的用法:mov ax,[bx+bp]、mov ax,[si+di]

  正确的用法

  1. mov ax,[bx]
  2. mov ax,[si]
  3. mov ax,[di]
  4. mov ax,[bp]
  5. mov ax,[bx+si]
  6. mov ax,[bx+di]
  7. mov ax,[bp+si]
  8. mov ax,[bp+di]
  9. mov ax,[bx+si+idata]
  10. mov ax,[bx+di+idata]
  11. mov ax,[bp+si+idata]
  12. mov ax,[bp+di+idata]

  只要在 […] 中使用寄存器 bp,而指令中没有显性的给出段地址,段地址就默认在 ss 中。比如

指令含义
mov ax,[bp](ax)=((ss)×16+(bp))
mov ax,[bp+idata](ax)=((ss)×16+(bp)+idata)
mov ax,[bp+si](ax)=((ss)×16+(bp)+(si))
mov ax,[bp+si+idata](ax)=((ss)×16+(bp)+(si)+idata)

8.2 机器指令处理的数据所在的位置

  绝大部分机器指令都是进行数据处理的指令,处理大致可分为三类:读取、写入、运算

  在机器指令这一层来讲,并不关心数据的值是多少,而关心指令执行的前一刻,它将要处理的数据所在的位置。

  指令在执行前,所要处理的数据可以在三个地方:CPU 内部、内存、端口

机器码汇编指令指令执行前数据的位置
8E1E0000mov bx,[0]内存,ds:0 单元
89C3mov bx,axCPU 内部,ax 寄存器
BB0100mov bx,1CPU 内部,指令缓存器

8.3 汇编语言中数据位置的表达

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

  1. 立即数(idata)   对于直接包含在机器指令中的数据(执行前在 CPU 的指令缓存器中),在汇编语言中称为:立即数(idata),在汇编指令中直接给出。例如:mov ax,1,对应机器码:B80100,执行结果:(ax)=1
  2. 寄存器   指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名。例如:mov ax,bx,对应机器码:89D8,执行结果:(ax)=(bx)
  3. 段地址(SA)和偏移地址(EA)   指令要处理的数据在内存中,在汇编指令中可用 [X] 的格式给出 EA,SA 在某个段寄存器中。
    1. 存放段地址的寄存器可以是默认的。   示例(段地址默认在 ss 中!)
      1. mov ax,[0](此处只能是 0,表示没有偏移地址,如改为其它数字均报错)
      2. mov ax,[bx]
      3. mov ax,[bx+8]
      4. mov ax,[bx+si]
      5. mov ax,[bx+si+8]
      6. mov ax,[bp]
      7. mov ax,[bp+8]
      8. mov ax,[bp+si]
      9. mov ax,[bp+si+8]
    2. 存放段地址的寄存器也可以是显性的给出。   示例
指令含义
mov ax,ds:[bp](ax)=((ds)×16+(bp))
mov ax,es:[bx](ax)=((es)×16+(bx))
mov ax,ss:[bx+si](ax)=((ss)×16+(bx)+(si))
mov ax,cs:[bx+si+8](ax)=((cs)×16+(bx)+(si)+8)

8.4 寻址方式

  当数据存放在内存中的时候,我们可以用多种方式来给定这个内存单元的偏移地址,这种定位内存单元的方法一般被称为寻址方式。

  8086 CPU 多种寻址方式小结

Avatar

Hui.Ke

❤ Cyber Security | Safety is a priority.
Previous 8.5 ~ 8.9