汇编语言中的约定

(…)和[ ]

(…):表示寄存器和单元的内容

(ax)=100 意思为ax寄存器中的值为100.

[ ]:表示内存单元,通常与DS段寄存器一起使用

mov ax,DS:[100] 意思为将DS:[100]单元的内容送入ax中

idata

符号idata的意思表示一个常量。

mov ax,idata 意思是将一个常量送入ax中,idata指代这里可以使用某个具体的数

标号

在汇编中标号代表一个地址。

1
2
3
4
5
6
7
8
9
10
11
12
assume cs:code
code segment
mov ax,2

mov cx,11
s: add ax,ax ;标号s表示这一段的地址
loop s ;重复执行地址s的内容

mov ax,4c00h
int 21h ;这里两句相当与c语言的return 0
code ends
end

在这里可以看到除了我们的汇编语句以外,还有一个单独的s,这个s就是标号,表示add ax,ax的地址。loop表示循环,后面会介绍。
在前一章里面的start表示代码段的开始地址,就是一个标号。

loop指令

某些时候我需要重复的执行一条语句,我们书写多遍会很麻烦,这个时候loop指令就可以完成这个工作,loop指令在使用的时候有那种情况

单独使用

首先我们给cx赋值,然后每执行一遍,给cx减一,cx不为0则重复执行。
就如上面的代码,我们先给cx赋值要执行的次数,然后标记要重复执行的代码地址,接着使用loop执行。
每执行一遍cx=cx-1,当cx=0时则停止执行。

与bx连用

这里我们需要结合bx一起使用。bx表示起始偏移地址,cx表示循环次数,每执行一次cx=cx-1。当cx为0时停止。
使用情况:操作一段连续的空间时

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
将ffff:0~ffff:b单元中的数据累加结果存储到dx中:
assume cs:code
code segement
mov ax,0ffffh
mov ds,ax ;给ds寄存器赋值
;使ds:[bx]指向数据的起始地址

mov bx,0 ;起始地址偏移为0
mov dx,0 ;初始化dx
mov cx,12 ;设置循环次数

s: mov al,[bx] ;这里传输的为字节数据,数据类型决定后面bx增加的值
mov ah,0
add dx,ax
inc bx ;高八位,低八位分别占1字节,所以加一,如果为字型则加二
loop s ;循环

mov ax,4c00h
int 21h
code ends
end

需要注意的是:
bx增加多少取决与累加的数据类型,数据类型可以看寄存器是ax还是al,ah,详细的将在后面介绍。

段前缀

我们在使用内存内容时,是采用的DS:[…],但是当有多个地址要操作时,我们也会使用操作附加数据的es寄存器。同样也是使用ES:[…]来表示。
因此我们引入了一个段前缀:

1
2
3
mov ax,DS:[100]           ;将DS:[100]单元的数据传入ax中
或者
mov ax,ES:[100] ;将ES:[100]单元的数据传入ax中

即显示的在前面加上段寄存器。