目录
数据处理的两个基本问题:
8.1 bx、si、di和bp
(1)8086中只有这四个寄存器可以用在[……]中进行内存单元的而寻址
(2)[……]中四个寄存器出现方式是固定的并不是随意的
(3)只要[……]中使用dp
8.2 机械指令处理的数据在什么地方
8.3汇编语言中数据位置的表达(三个概念表达数据位置)
(1)立即数(idata)
(2)寄存器
(3)段地址(SA)和偏移地址(EA)
8.4寻址方式
8.5指令要处理的数据有多长
(1)通过寄存器判断所处理数据的尺寸
(2)没有寄存器名称时用X ptr 指明内存单元
(3)push pop 只进行字操作
8.6寻址方式的综合应用
8.7div指令
8.8伪指令dd
8.9操作符dup
1:.数据在啥地方
2.数据有多长
此书以后定义两个描述性符号:
1.reg :寄存器
①.reg:a、b、c、d+x
②.a、b、c、d对应h和l
③.sp、 bp 、si、 di
2.sreg:段寄存器
①d、e、s、c+s
(可以巧记为:D+键盘上的esc键);
如下指令均正确:mov ax,[bx]
mov ax,[bx+si]
mov ax,[bx+di]
mov ax,[bp]
mov ax,[bp+si]
mov ax,[bp+di]
而下边的确是错误的:
mov ax,[cx]
mov ax,[ax]
mov ax,[dx]
mov ax,[ds]
他们可以单独出现 或者
mov ax,[ bx +si/di]
mov ax,[bp+si/di]
上边的写法si和di后边都可以加数字
而下边这种写法是错误的
mov ax,[bx+bp]
mov ax,[si+di]
那么段地址就默认是在ss中
mov bx,[0] 数据在内存中 ds:0单元
mov bx,ax 数据在cpu内部 ,ax寄存器
mov bx,1 内部指令缓冲器
对于直接包含在机械指令中的数据(执行前在CPU的指令缓冲器中),在汇编语言中称为立即数(idata),在汇编指令中直接给出。
例:mov ax,1
add bx,2000h
or bx,00010000b
mov al,'a'
指令要处理的数据在寄存器中,在汇编指令中给出相应的寄存器名
例如:
mov ax,bx
mov ds,ax
push bx
mov ds:[0],bx
指令要处理的数据在内存中,在汇编指令中可以1用[X]的格式给出EA,SA在某个段寄存器中
存放段地址的寄存器可以是默认的,比如
mov ax,[0]
mov ax,[di]
mov ax,[bx+8]
mov ax,[bx+si]
mov ax,[bx+si+8]
以上段地址默认在ds中
mov ax,[bp]
mov ax,[bp+8]
mov ax,[bp+si]
mov ax,[bp+si+8]
等指令段地址默认在ss中;
也可以直接给给出段地址寄存器
如下:
mov ax,ds:[bp] ds为段地址 bp中存放的值为偏移地址
mov ax,es:[bx] es为段地址 bx中存放的值为偏移地址
以上图片源于王爽老师的汇编语言第四版
若有侵权联系删除
8.86cpu 可以处理两种尺寸数据 byte(字节)和word(字)
ax,bx,dx 均为16位寄存器 所以代表处理数据为一个字
而al bl 是16位寄存器分成的一个8位寄存器所以是字操作
例如
inc word ptr [bx]
mov word ptr ds:[0],1
(以上为子、字单元)
mov byte ptr ds:[0],1
访问的就是字节单元了
一般来说,我们可以用[bx+idata+si]的方式来访问结构体中的数据。用bx来定位整个结构体,idata定位结构体中的某个数据项,si定位数据项中的每个元素。汇编:[bx].idata、[bx].idata[si]
div除法指令:使用时应注意以下问题
(1)除数:
有8位和16位两种在一个reg或内存单元中
reg :寄存器
①.reg:a、b、c、d+x
②.a、b、c、d对应h和l
③.sp、 bp 、si、 di
(2)被除数 :
默认放在AX 或 AX和DX中
如果除数为8位则被除数为16位
如果除数为16位则被除数为32位在DX和AX中存放
DX存放高16位AX存放低16位
(3)结果
如果除数为8位则AL放商 AH放余数
如果除数为16位 AX放商 DX放余数
格式如下:
div 除数
div reg
div 内存单元
以上图片源于王爽老师的汇编语言第四版
若有侵权联系删除
dword (double world)
每一位16进制是由4位2进制转化而来的所以每两位16进制代表一个字节
在dosbox中
每一行有16个字节 每一个16进制数据(两位) 即每两个空格隔开的数据是一个字节 16位
(自己的想法,可能不完全对)若有错误欢迎指教。
和dd dw db 一样也是由编译器识别处理的符号
和dd dw db 等数伪指令配合使用,用来表示数据的重复
如db 3 dup (0)
定义了三个字节等同于 db 0,0,0
db 3 dup (0,1,2)
定义了九个字节 0,1,2,0,1,2,0,1,2
相当于 db 0,1,2,0,1,2,0,1,2
db '666'
db 单引号
单引号中有几个字母或数字就是几个字节
dup 的使用格式
db/dw/dd 重复的次数 dup (重复的字节/字/双字型数据)