1、对比以下的指令分辨(对于masm来说 不是对于debug来说)
mov al,[0] ;此指令的目的是将数值0传送到al中去,与mov al,0相同
mov al,ds:[0] ;将段地址为ds偏移量为0的内存空间的值传送到al中去
mov al,[bx] ;以bx的值为偏移量,段地址默认在ds中 将此内存空间中的数据传送到al中去
mov al,ds:[bx] ;与上面那一条相同。
2、注意:
assume cs:code
code segment
start: mov ax,2000H
mov ds,ax
mov bx,0
mov al,[0] ;1、注意用记事本写代码和debug写代码是不同的
;比如此处的 [1],[2],[3],编译连接后的结果并不是指偏移地址
;而是数值1,2,3 但是在debug中如果这样写却是指的偏移地址
;比如 -a 1000:10 mov ax,[3] 则是指的是偏移地址为3的内存
;空间中的数据,而不是将值3传送到ax中去
;在记事本中[0] 和0是相同的
;2、如果我们想将偏移地址[0]、[1]、[2]、[3]中的数据(当然段地址在ds中)
;传送到al bl cl中的话 我们可以借助bx这个寄存器(此寄存器就是为了masm编译而生)
;比如先用mov bx,0 然后mov al ,[bx]
;[bx]是8位的数据,所以当mov ax,[bx]可能出错 我们一般会这样去做mov al,[bx] mov ah,另外一个数据
;在汇编源程序当中数据不能以字母开头 比如ffff 必须在前面加上一个0
;3、如果我们想通过[2] 且通过masm来编译的话 就得加上段地址 这样我们就可以
;将[2]当作偏移地址了 而不是值了 比如:mov al,ds:[2]
mov cl,[2]
mov dl,[3]
mov ax,4C00H
INT 21H
code ends
end start
3、loop与bx的联合使用实例
assume cs:code
code segment
start: mov ax,0ffffh
mov ds,ax ;这是数据段地址
mov bx,0 ;这是初始偏移地址
mov dx,0 ;这是对存放结果的寄存器进行初始化
mov cx,12 ;这是循环的次数
s: add dx,[bx] ;注意此处有错误 因为内存是以字节管理的即每一个单元只有八位
;而dx是16的寄存器,我们不能如此相加 原因在于add指令的源操作数和
;目的操作数的长度必须保持一致 且目的操作数不能为立即数 但可以
;为寄存器或内存单元 源操作数都可以 是不能同时为内存单元
add bx,2
loop s
mov ax,4c00h
int 21h
code ends
end start
;修改方法1 借助中介ax来进行操作
assume cs:code
code segment
start: mov ax,0ffffh
mov ds,ax ;这是数据段地址
mov dx,0
mov al,ds:[0]
mov ah,0
add dx,ax
. .
. .
. .
. .
. .
;这样进行12次即可以得到结果了
mov ax,4c00h
int 21h
code ends
end start
;修改方法2
assume cs:code
code segment
start: mov ax,0ffffh
mov ds,ax
mov dx,0
mov bx,0
mov cx,12
s: mov al,[bx]
mov ah,0
add dx,ax
inc bx
loop s
mov ax 4c00h
int 21h
code ends
end start