mov ax, [bx]
- 偏移地址只能用
bx
- 对于汇编代码,直接使用
mov ax, [0]
其实是把0赋给ax,而不是对于偏移地址为0的内存块赋给ax - 需要先把0赋给bx,
mov bx, 0
,再用mov ax,[bx]
把对应的内存块赋值给ax。 - 可以在
汇编
中使用mov ax, ds:[0]
来达到类似效果,把ds:0的内容放到ax中,这样可以省略使用bx的步骤。
描述性符号"()"
这里的描述性符号只是为了方便描述,不是说程序可以这样写
- 代表取地址,或者说取内容
- (ax)=0010H;代表ax中的内容0010
- 2000:1000处的内容为0010,可以这样(21000)=0010;
- 对于
mov ax, [2]
可以这样(ax) = ((ds)*16+2)
代表地址寄存器的位置向左移一位,加上偏移地址,取里边的内容,赋值给ax - 对于
mov [2],ax
可以这样((ds)*16+2)=(ax)
代表地址寄存器的位置向左移一位,加上偏移地址,取ax里边的内容,赋值给内存 - 对于
pop ax
,等同于(ax) = ((ss)*16+sp) (sp)=(sp)+2
约定符号idata表示常量
inc/dec指令
inc ax
ax自增加一dec ax
ax自减减一
loop 指令
- 指令格式
loop 标号
- 只能用CX来存放循环次数
- loop指令的标号所标志的地址要在前边
-
标号其实标记一个地址,标号会被翻译成一个偏移地址
- loop其实是改变IP,跳转回之前标记的偏移地址
- cpu执行loop指令需要两步执行:(cx)=(cx)-1; 判断ax中的值,不为零则转至标号处执行程序,为0则向下执行。
assume cs:code
code segment
start:
mov ax, 2
mov cx, 4
s:add ax,ax
loop s
mov ax, 4c00H
int 21H
code ends
end start
在汇编中,数据不能以字母开头
debug循环调试的g命令
g命令
类似于断点调试,g xxxx
就是让程序执行到xxxx结束- 例如,循环到04ae:000a结束,那么可以
g 000a
,程序会一直执行到000a为止
将八位的数据累加到十六位的寄存器中
注意前提是八位数据,而不是十六位数据
- 计算ffff:0~ffff:b单元中的八位数据的和,存储在dx中,因为dx是十六位的寄存器,而内存单元是八位一格,所以两边是不匹配的,不能直接赋值。
- 解决方法,把内存单元中的八位数据存到一个中介寄存器中,例如
mov al,ds:[0]
再用寄存器去加 - 使用loop
一段安全的空间
- 8086模式下随意向一段内存空间中写入数据是很危险的,因为这段内存可能有其他信息
- 一般的PC机中,dos和其他合法程序都不会使用0:200H~0:2fffH这一段256个字节的空间,所以使用这一段空间是安全的。
内存
- 默认
ds
是存储内存段地址 - 也可以用
mov ax, es:[0]
显式的使用段地址,