5.1[bx]
-
[bx]是什么?
- 实际上debug的语法和masm编译的语法是不一样的
- 如果直接使用 mov ax, [0] 是不行的,编译器会把它看做 mov ax, 0
- 需要使用bx, 比如 mov bx, 0, mov ax, [bx]的形式
-
mov ax, [bx]
- 功能:将bx中存在的数据作为一个偏移地址EA,段地址SA默认在ds中, 将SA:EA处的数据送入ax中
mov ax, 2000H
mov ds, ax
mov bx, 1000H
mov ax, [bx]
inc bx
inc bx
mov [bx], ax
inc bx
inc bx
mov [bx], ax
inc bx
mov [bx], al
inc bx
mov [bx], al
-
内存中的情况
- 2000:1000 = BE
- 2000:1001 = 00
-
上述程序分析:
-
先看一下前三条指令
mov ax, 2000H
Mov ds, ax
Mov bx, 1000H
-
再看第四条指令:
mov ax, [bx]
- 将内存中2000:1000处的字型数据送入ax中, 结果ax=00be
- inc bx inc bx, inc 表单自增, 执行后bx=1002
-
mov [bx], ax
- 将ax中的值送入 ds:bx=2000:1002中
- ax == 00be,
5.2 Loop指令
-
(x)的应用,比如:
- ax中的内容为0010, 我们可以用这样描述:(ax)= 0010
- 2000:1000 处的内容为0010, 我们可以这样来描述(21000)=0010
- 对于mov ax,[2]的功能, 我们来描述: (ax)=((ds)16+2)
- 对于mov[2], ax的功能,我们可以这样来描述:((ds)16+2)=(ax)
- add ax, bx的功能:(ax)=(ax)+(bx)
- push ax的功能,我么可以这样描述:
-
idata表示常量
- mov ax, [idata]就代表mov ax,[1], mov ax, [2]等
-
指令的格式:
-
loop具体应用:
- 编程计算2的2次方,结果放在ax中
assume cs:code
code segment
mov ax, 2
add ax, ax
mov ax, 4c00H
int 21H
code ends
end
-
计算2的三次方
assume cs:code
code aegment
mov ax, 2
add ax, ax
add ax, ax
mov ax, 4c00H
int 21H
code ends
- 计算2的12次方
- ```assembly
assume cs:code
code segment
mov ax, 2
; 做11次add ax,ax
mov cx, 11
s:add ax, ax
loop s
mov ax, 4c00H
int 21H
code ends
end
- 标号:
1. 在汇编语言中,标号就代表了一个地址, 此程序中一个标号它实际上表示了一个地址, 这个地址处有一条指令:add ax, ax
2. Loop s
1. (cx)=(cx)-1
2. 判断cx中的值, 不为0则转至标号s所表示的地址处执行, 如果为0,则执行下一条指令
3. 一下三条指令
mov cx, 11
S:add ax, ax
Loop s
- 执行loop时, 首先要将(cx)- 1 若不为0 这继续执行 add ax, ax, 所以利用cx来控制add ax, ax的执行次数
- cx和loop指令配合实现循环功能的三个要点
1. 在cx中存放循环次数
2. loop指令中的标号所标识地址要在前面
3. 要循环执行的程序段, 要写在标号和loop指令中间
- 用加法计算123*236, 结果放在ax中
- ```assembly
assume cs:code
code segment
mov ax, 0
mov cx, 123
s:add ax, 236
loops
mov ax, 4c00H
int 21H
code ends
end
5.3 在debug中用loop指令实现的循环过程
- 首先,我们将它编辑为源程序文件, 文件名定义为p3.asm, 对齐进行编译链接后生p3.exe, 然后再用debug对p3.exe中的程序进行跟踪
- 如果是循环比较多 可以使用debug的g指令调到指定地址, 跳过循环执行过程
5.4 debug和汇编编译器masm对指令的 不同处理
- debug指令
mov ax, 2000H
mov ds, ax
mov al, [0]
mov bl, [1]
mov cl, [2]
mov dl, [3]
- masm汇编程序
assume cs:code
code segment
mov ax, 2000H
mov ds, ax
mov bx, 0
mov al, [bx]
mov bx, 1
mov bl, [bx]
mov bx, 2
mov cl, [bx]
mov bx, 3
mov dl, [bx]
mov ax, 4c00H
int 21h
code ends
end
- 上面说在汇编程序中不能直接写[2]这种格式,但是加上段地址也可以实现
assume cs:code
code aegment
movv ax, 2000H
mov ds, ax
mov al, ds:[0]
mov bl, ds:[1]
mov cl, ds:[2]
mov dl, ds:[3]
mov ax, 4c00H
int 21H
code ends
end