从0学习汇编语言(7-8)更灵活的定位内存地址的方法 & 数据处理的两个基本问题

179 阅读4分钟

《从0学习汇编语言目录》

第七章 更灵活的定位内存地址的方法

7.1 and 和 or 指令

and 按进行运算 or 按进行运算

7.5 【bx+idata】

ps: idata 表示为立即数, 例如 [bx+4] 我们可以用[bx]的方式来指名一个内存单元,还可以用[bx+idata]来表示一个内存单元,它的偏移地址为bx + idata mov ax,[bx+200]的含义为 (ax) = ((ds)*16 + (bx) + 200)

7.6 用[bx+idata]的方式来处理数组

可以用[bx] 和 [bx + idta]来处理二维数组。 例如数组 [[1,2,3],[3,4,5]],我们可以通过 [bx] 和[bx + 3] 来分别获取到 第一个数组的bx位置的元素和 第二个数组中的bx位置的元素

7.7 si和di

si和di是8086cpu中和bx比较相近的寄存器,都是16位寄存器

7.8 [bx+si] 和 [bx+di]

可以通过这种形式来获取(bx+si) 和 (bx+di)内存地址的信息

7.9 [bx+si+idata] 和 [bx+di+idata]

可以通过这种形式来获取(bx+si+idata) 和 (bx+di+idata)内存地址的信息

这一章比较简单,讲了bx si di 寄存器和 and or 指令

第八章 bx、 si、di、 和 bp

8.1 bx、si、di 和bp

可以这么理解 bx bp 为A类 si di为B类 idata为C类 A、B、C 三类可以随意组合, 但A、B不能同时拥有两个同类。 例如 bx + bp si + di 是错误的 bx + si, bx + di + idata 是正确的

如果[...] 中含有bp, 则段地址默认在ss

8.2 机器指令处理的数据在什么地方

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

立即数

对于直接包含在机器指令中的数据(执行前在CPU的指令缓存器中),在汇编语言中成为立即数(idata),z在汇编中直接给出。 例如: mov ax, 1

寄存器

指令要处理的指令在寄存器上中,在汇编指令中给出相应的寄存器名 例:move ax,bx

段地址(SA)和偏移地址(EA)

指令要处理的数据在内存中,在汇编指令中可以用[x]的格式给好处EA,SA存在某个段寄存器中

  1. 以下默认在ds段寄存器中: mov ax, [0] mov ax, [di] mov ax, [bx] mov ax, [bx+si] mov ax, [bx+si + 8]
  2. 以下默认在ss段寄存器中: mov ax,[bp] mov ax,[bp+8] mov ax,[bp+si] mov ax,[bp+si+8]

8.4 寻址方式

8.5 指令要处理的数据有多长

8086CPU的指令,可以处理两个尺寸的数据,分别为byte和word, 分别为8位和16位

  1. 通过寄存器名称来指名处理数据的尺寸 例如: mov ax, 1 处理为16位, 为一个字 mov al, 1 处理为8位, 为一个字节 mov al, ds:[0] 一个字节

  2. 在没有寄存器名称的情况下,用操作符 X ptr指名内存单元的长度, X在汇编指令中可以为word活byte 以下指令用word ptr指令访问内存单元是一个: mov word ptr ds:[0],1 inc word ptr [bx] 以下指令用byte ptr指令访问内存单元是一个字节 mov byte ptr ds:[0],1

  3. 其他情况 有些指令默认访问的是字节还是字单元,比如 push[1000h] 就不用指明是字还是字节单元,因为push只能进行操作

8.7 div指令

div是除法指令,使用div做除法的时候应该注意一下几个问题

  1. 除数: 有8位和16位两种
  2. 被除数:默认放在AX或 DX和AX 中,
    1. 如果除数为8位,则被除数为16位。默认在AX中
    2. 如果除数为16位,则被除数在DX和AX中, AX中放低16位 DX放高16位
  3. 结果:
    1. 如果除数为8位, 则AL为商 AH为余数
    2. 如果除数为16位,则AX为商 DX为余数

div 操作的在哪里,被除数多少位,都掌握在除数手中

8.8 伪指令dd

db: 定义字节类型数据 dw: 定义类型数据
dd: 定义两个字类型的数据(double word)

8.9 dup

dup是个操作符,在汇编语言中同db、dw、dd等一样,也是由编译器识别处理的符号,需要配合db、dw、dd使用,进行数据的重复

db 3 dup (0) 定义了是3个字节,他们都是0 相当于db 0, 0 ,0 db 3 dup (0,1,2) 定义了是9个字节,他们都是0 相当于db 0, 1 ,2, 0, 1 ,2, 0, 1 ,2

第九章 转移指令的原理》