1、[BX]
[BX]表示一个内存单元,它的偏移地址在bx中。
mov ax,[bx]
功能:bx中存放的数据作为一个偏移地址EA,段地址SA默认在ds中,将SA:EA处的数据送入ax中。
2、符号(约定方便阅读和理解)
描述性符号“()”
表示一个寄存器或一个内存单元中的内容。
例:ax中内容为0010H
(ax)=0010H
对于mov ax,[2]
(ax)=((ds)*16+2)
对于mov [2],ax
((ds)*16+2)=(ax)
符号idata
表示常量。
3、inc(+1),dec(-1)
inc bx
把bx中的值加1
dec bx
把bx中的值减1
4、loop指令(含义“循环”)
格式:loop 标号
CPU执行loop指令时,要进行两个操作
- cx=cx-1
- 判断cx中的值,不为零则转至标号处执行程序,为零则向下执行
通常用loop指令来实现循环,cx中存放循环次数。
实现循环功能的框架
mov cx,循环次数
s:
循环执行的程序段
loop s
例:编程计算2^12
code cs:code
code segment
start:
mov ax,2
mov cx,11
s:add ax,ax
loop s
mov ax,4c00h
int 21h
code ends
end start
在源汇编程序中,数据不能以字母开头,所以前面要加0。
例:将ffff:0~ffff:b中的八位数据,累加到16位寄存器中
需要解决的问题:类型的匹配以及结果的不超界。
方法:
用一个16位寄存器作为中介
将内存单元中的八位数据赋值到1个16位寄存器ax中,再将ax中的数据加到dx上,从而使两个运算对象的类型匹配且不超界。
如:
mov al,ds:[0]
mov ah,0
add dx,ax
例:
assume cs:code
code segment
mov ax,0ffffh
mov ds,ax
mov bx,0
mov dx,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
5、段前缀
“ds:”、“cs:”在汇编语言中称为段前缀
例:mov ax,cs:[0]
6、一段安全空间
在内存中写入数据要考虑这片空间是否安全(即是否为空)
一般程序和操作系统不会使用0:200~0::2FF。
例:拷贝
assume cs:code
code segment
mov ax,2000
mov ds,ax
mov ax,0
mov es,ax
mov bx,0
mov cx,16
s: mov ax,ds:[bx]
mov es:[bx],ax
inc bx
loop s
code ends
end