企业🤖AI智能体构建引擎,智能编排和调试,一键部署,支持知识库和私有化部署方案 广告
[TOC] 问题: + 处理的数据在什么位置? + 指令要处理的数据有多长? # bx、si、di、dp + 在 8086 CPU中,只有ax、bp、si、di这四个寄存器客户以通用`[...]`来进行内存单元的寻址。 指令要处理的数据有多长? ![](https://box.kancloud.cn/85d0cc74e537da1ba2bb0a3a8de9182b_798x440.png) + 在“[…]” 中,这4个寄存器(bx、bp、si、di)可以单个出现,或只能以四种组合出现: - bx和si - bx和di - bp和si - bp和di + 只要在`[...]`中使用寄存器`bp`,而指令中没有显性的给出duan![](images/screenshot_1505977195279.段地址,段地址默认就在 `ss` 中。 # 机器指令处理的数据所在的位置 觉得大多数机器指令都是进行数据处理的指令,可以分为三类: + 读取 + 写入 + 运算 在执行指令前,所需处理的数据可以在三个地方: + CPU内部 + 内存 + 端口 ![](https://box.kancloud.cn/b61646234d54c8892a2c3c4636fd9c6c_300x76.png) # 汇编语言中数据位置的表达 用三个概念来表达数据的位置: + 立即数(idata) + 寄存器 + 段地址(SA)和偏移地址(EA) ## 立即数 执行前放在CPU的指令缓冲器中。 ~~~ mov ax, 1 ~~~ ## 寄存器 指令要处理的数据在寄存器中,汇编语言给出相应的寄存器名。 ~~~ mov ax, bx ~~~ ## 段地址(SA)和偏移地址(EA) 需要处理的数据在内存中,在汇编中使用 `[X]` 的格式给出段地址。 **默认的** ~~~ mov ax, [0] mov ax, [bx] mov ax, [bx+8] mov ax, [bx+si] mov ax, [bx+di] ; 存放段地址的寄存器是默认的: ds中 mov ax, [bp] ; 与bp相关的都放在 ss 中的 ~~~ **显示给出** ![](https://box.kancloud.cn/965804df63cabcfa6034dc8d285881ae_748x204.png) # 寻址方式 ![](https://box.kancloud.cn/e71764b3655c0ff0a5a811f0d390b5be_802x494.png) # 指令要处理的数据有多长? 8086CPU中可以处理两种尺寸的数据:`byte`和`word`,即字操作、字节操作。 ## 通过寄存器名指定要处理的数据的尺寸 ~~~ mov ax, 1 ; 0001H 1word mov bx ds:[0] ;上面的是字节操作 mov al, 1 mov al, ds:[0] ; 以上的是字操作 ~~~ ## 在没有出现寄存器名的情况下,使用`作符X ptr`来指明内存单元的长度 注意:X可以为`word`、`byte` ~~~ mov word ptr ds:[0], 1 inc word ptr [bx] ~~~ `mov word ptr ds:[0], 1`和`mov byte ptr ds:[0], 1`的区别与联系: 联系:都是访问的`ds:1000H`的单元 区别: + `mov word ptr ds:[0], 1`修改的是`ds:1001H` + `mov byte ptr ds:[0], 1`修改的是`ds:1000H` ## 其他方法 push ~~~ push [1000H] ; push只进行字操作 ~~~ # 寻址方式的综合应用 # div 指令(除法) `div`是`division`的缩写,是除法指令 除数:8位或16位,在寄存器或者内存单元中 被除数:放在AX 或DX、AX中 | 除数 | 被除数 | | --- | --- | | 8位 | 16位(AX) | | 16位 | 32位(DX+AX) | **结果** | 运算 | 8位 | 16位 | | --- | --- | --- | | 商 | AL | AX | | 余数 | AH | DX | ## 格式 ~~~ div 寄存器 div 内存单元 ~~~ ## 实例 ~~~ div byte ptr ds:[0] ~~~ 含义: + (al) = (ax)/((ds)*16 + 0) 的商 + (ah)= (ax)/((ds)*16 + 0) 的余数 ~~~ div word ptr es:[0] ~~~ 含义: + (ax) = [(dx)*10000H + (ax)] / ((ds)*16 + 0) 的商 + (dx) = [(dx)*10000H + (ax)] / ((ds)*16 + 0) 的余数 ## 案例 + 计算 100001/100 ~~~ mov dx, 1 mov ax, 86a1H ; (dx)*10000H + (ax) = 100001 mov bx, 100 div bx ; 结果:商:(ax)=03E8H;余数:(dx) = 1 ~~~ + 计算 1001/100 ~~~ mov ax, 1001 mov bl, 100 div bl ; ~~~ # dd 伪指令 > db、dw用来定义`字节型`数据和`字型`数据 `dd`用来定义dword(double word双字节)型数据 ## 实例 ~~~ data segment db 1 ; data:0,占1字节,值为: 01H dw 1 ; data:1 占 1字节;值为: 0001H dd 1 ; data:3 占2字节;值为: 0000 0001H data ends ~~~ # dup 是一个操作符,是一个伪指令 ~~~ dd 3 dup(0) ; 定义类3个字节,他们的值都是 0 ,相当于 dd 0,0,0 dd 3 dup(0,1, 2) ; 定义了 9 个字节,相当于 dd 0, 1, 2, 0, 1, 2, 0, 1, 2 dd 3 dup('abc', 'ABC') ; 定义了 18个字节,相当于 dd 'abcABCabcABCabcABC' ~~~ ## 格式 ~~~ dd 重复的次数 dup(重复的双字节型数据) ~~~