引言

1.描述性符号

1
2
1.reg 来表示一个寄存器
2.sreg 来表示一个段寄存器

1.bx,si,di,bp

1.对 bx si di 进行一下小小的总结

1
2
3
在8086CPU中,只有【bx,bp,si,di】可以用在[]中来进行内存单元的寻址

[ax]这样是错的!!!!

2.在[]中,这4个寄存器可以单个出现,或者只能有4种组合

1
2
3
4
5
[bx+si];[bx+di]
[bp+si];[bp+di]

si和di 不行
bx和bp 不行

3.在[]内使用bp和bx的区别

1
2
3
4
5
如果是使用[bx]则默认段地址是ds
ds是数据段地址
如果使用[bp]则默认段地址是ss
ss是栈段地址
所以这个bp和sp类似咯

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

1.绝大部分的机器指令都是进行数据处理的指令,处理大致可分为

1
读取,写入,运算

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

3.所要处理的数据可以在三个地方

1
2
3
1.CPU内部
2.内存
3.端口
1
2
3
4
汇编指令		命令执行前数据的位置
mov bx,[0] 内存, ds:0单元
mov bx,ax CPU内部,ax寄存器
mov bx,1 CPU内部,指令缓冲区

4.在汇编语言种有3个概率来表达数据的位置

1
2
3
4
5
6
7
1.立即数(idata)
CPU的指令缓冲区
2.寄存器()
CPU内部的寄存器种
3.段地址(SA)和偏移地址(EA)
内存中
可以用ds:[这个里面不能写idata]

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

1.显性的给出段地址

1
mov ax,ds:[sp]

2.使用默认的段地址

1
mov ax,[bx]默认就是ds:[bx]

4.寻址方式

image-20230412112201335

小总结

1
2
3
4
5
CPU首先是读取:
也就是CS:IP 通过地址加法器,然后走地址总线去找到相对应的地址,拿出里面的指令【机器码】【A1E100啥的】,把这个东西放入指令缓冲区。
CPU就会对这个机器码读取
然后去进行通过这个机器码读取出来的命令来工作
工作完成后,又会去读取CS:IP【这个时候ip是递增后的】

5.指令要处理的数据有多长?

1.有2中 byte 和 word 型的数据

1
2
3
4
5
1.通过寄存器名字来指明需要处理数据的尺寸
ax bx
al

2.在没有寄存器名存在的情况下,用操作符X ptr指明内存单元的长度,X在汇编指令中可以为 word 或 byte

2.型方法

1
2
3
4
5
mov word ptr ds:[0],1
inc word ptr [bx]===>这个是内存单元 ds:[bx]
inc word ptr ds:[0]

inc byte ptr [bx]

3.在没有寄存器参与的内存单元访问指令中,用word ptr 或者byte ptr 来指明需要访问的内存单元

否则CPU很shabi

6.寻址方式的综合应用

这里有一个例子,自己去看书

1.我们可以看到,8086CPU提供了如[bx+si+idata]的寻址方式为结构化数据的处理提供了方便

2.使得我们可以在编程的时候,从结构化的角度去看待所要处理的数据

3.从上面我们就可以看到,一个结构化的数据包含了多个数据项,而数据项的类型又不相同,又的是字型数据,有的是字节型数据,有的和是数组【字符串】

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

1
2
用bx来定位整个结构体,用idata来定位结构体中的某一个数据项,用si定位数组项中的每个元素
为此,汇编语言提供了[bx].idata [bx]idata[si]的方式

5.所以在C语言中我们看到的 dec.cp[i];dec是一个变量名,指明了结构体变量的地址,cp是一个名称,指明了数据项cp的地址,而用i来定位cp中的每一个字符

在汇编语言中:bx.10H[si]

7.div指令

1.div指令就是÷

在使用div作为除法的时候

1
2
3
4
5
6
7
8
除数:8位或16位,在寄存器或者内存单元中
被除数:(默认)放在ax或者dx和ax中

被除数是用AX还是DX+AX是看除数的大小

除数 被除数
8位 16位(AX)
16位 32位(DX+AX)【这里的+不是加而是放在前面】

结果:

1
2
3
运算	 8位	  16位
商 AL AX
余数 AH DX

格式:

1
2
1.div reg
2.div 内存单元

现在我们可以用多种方法来表示一个内存单元咯

示例:

1
2
3
4
5
6
7
8
9
10
div byte ptr ds:[0]
含义就是:
(al)=(ax)/((ds)*16+0)的商
(ah)=(ax)/((ds)*16+0)的余数
div后面的内存单元或者寄存器,里面的数据都是当作被除数来解析

div word ptr es:[0]
含义为:
(ax)=[(dx)*10000H+(ax)]/((ds)*16+0)的商
(dx)=[(dx)*10000H+(ax)]/((ds)*16+0)的余数

实现:计算100001/100

1
2
3
4
5
6
;首先100001是186a1H   大于FFFFH所以需要用dx和ax

mov dx,1
mov ax,86a1H
mov bx,100 ;会自动的选取ax和dx来进行除法
div bx

8.伪指令dd

1.前面我们学过db 和 dw 来定义字型数据和字型数据

dd是用来定义dword(double word双字节)

1
CPU是64位,操作系统要64位,在操作系统的软件是64位

例子:

1
2
3
4
5
6
7
8
9
10
data segment
db 1
dw 1
dd 1
data ends

在data 段中定义了3个数据
第一个数据是 01H 在data:0处,占用1个字节
第二个数据是 0001H 在data:1处,占2个字节
第三个数据是00000001H 在data:3处,占4个字节

问题:8.1计算data段中第一个数据/第二个数据后的结果,商放在第三个数据存储单元中

1
2
3
4
5
data segment 
dd 100001
dw 100
dw 0
data ends

9.dup

1.dup 是一个操作符号,在汇编语言中和db ,dw ,dd 等一样,都是由编译器识别处理的符号

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

3.实例:

1
2
3
4
5
6
7
8
9
10
1.db 3 dup(0)
定义了3个字节,它们的值都是0
相当于 db 0,0,0

2.db 3 dup(0,1,2)
定义了9个字节,每3个是0,1,2
相当于:db 0,1,2,0,1,2,0,1,2

3.db 3 dup('abc','ABC')
相当于:db 'abcABCabcABCabcABC'

4.所以说dup

1
db【数据定义的伪指令】 次数 dup(内容)

10.实验七-寻址方式在结构化数据访问中的应用

自己去看

exp7.asm