使用偏移地址寄存器来访问内存单元
我们通常使用访问内存单元的语句位 mov ax,ds:[0]
我们也可以使用这样的形式访问内存单元 mov ax,ds:[bx]
我们称bx位偏移地址寄存器,这里只能使用bx寄存器
bx成为偏移地址寄存器
inc指令表示将目标操作数加1
assume cs:code
code segment
mov ax,2000H
mov ds,ax
mov bx,1000H
mov cl,0
cc: mov ds:[bx],cl
inc cl
inc bx
jmp cc
code ends
end
这段指令的含义便是将0,1,2,3,4,5…辅助到一个内存中,我们使用了cc: mov ds:[bx],cl 这个指令中的cc表示一个标号,可以说是这个内存的地址
loop指令 这个指令和jmp指令也是相同的,都可以进行跳转,我们通常使用loop指令来进行循环,我们使用这个指令可以限制循环的次数,将循环的次数保存在cx寄存器中,没循环一次cx寄存器便会减一,当cx为0时便退出了循环,下面是一个例子进行说明。
assume cs:code
code segment
mov ax,2000H
mov ds,ax
mov cx,4
mov bx,1000H
mov dl,0
cc: mov ds:[bx],dl
inc dl
inc bx
loop cc
code ends
end
下面使用汇编指令做一道算术题 123X456的值
assume cs:code
code segment
mov cx,123
mov bx,0
num:add bx,456
loop num
code ends
end
在通过循环是我们使用p命令跳过循环
编程题
将FFFF:0FFFF:F内存单元的数据存放在0:2000:20F中
assume cs:code
code segment
mov bx,0
mov cx,8
num:mov ax,0FFFH
mov ds,ax
mov ax,ds:[bx]
mov dx,20H
mov ds,dx
mov ds:[bx],ax
inc bx
inc bx
loop num
code ends
end
es寄存器 也是和数据有关的寄存器 这个寄存器也是段地址寄存器和ds的作用是一样的,为什么要有ds和es两个数据段地址寄存器哪?
比如上面那个例子中我们需要设置两个段地址寄存器,而我们的做法是将ds相互转换的,这种方式是很复杂的而且浪费内存空间,因此我们可以通过es寄存器来改写上面的代码。
assume cs:code
code segment
mov bx,0
mov cx,8
mov ax,0FFFFH
mov es,ax
mov ax,20H
mov ds,ax
num:mov ax,es:[bx]
mov ds:[bx],ax
inc bx
inc bx
loop num
code ends
end
我将es当做原目的数据地址,将ds当做目的数据段地址的
使用es保存FFFFH,使用ds保存20H