汇编语言:第五章 [BX]和loop指令

1.[bx]与内存单元

  [bx]是指 段地址在DS中,偏移地址在bx中的内存单元

2.loop

  用于描述循环

3.我们定义的描述性符号 "()"

  寄存器:  (ax/al)表示ax/al寄存器中的内容

  段寄存器:   ((ds)*16+(bx))表示段地址为ds内容,偏移地址为bx内容的内存单元的内容

  内存单元:   (20000H)表示20000H内存单元中的内容

4.约定符号idata表示常量

mov ax,idata  表示mov ax,1  mov ax,2  等

mov ax,[idata]  表示mov ax,[1]   mov ax,[2]   等

段寄存机不可用这种方式mov

5.1[BX]

mov ax,[bx]  把ds内容作为段地址,bx内容作为偏移地址的2个内存单元内容放到ax中

mov [bx],ax  把ax内容放到ds内容作为段地址,bx内容作为偏移地址的2个内存单元中

5.2 loop指令

格式: loop 标号

loop执行步骤:1.(cx)=(cx)-1   2.判断cx,不是0则转到标号位置执行

例:计算2的12次方

assume cs:code

code segment

mov ax,2

mov cx,11

s:add ax,ax

loop s

code ends

end

5.3用debug跟踪loop指令

debug 1.exe

-r

-t

-t

..

-p (int 21H用p执行)

1.如果想直接跳到CS:XX位置处执行用 -g XX

2.如果想在循环中跳出,即结束循环后停下等待-t,  使用-p命令

5.4 Debug和汇编编译器对指令的不同处理

  同一指令:

  mov ax,[0] 在debug中表示把DS:0和DS:1的内存单元内容放到ax中

        在masm中等于  mob ax,0

  如何解决汇编源程序问题 :

  1. mov bx,0     mov ax,[bx]

  2. mov ax,DS:[0]

5.5 Loop和[bx]的联合应用

 计算ffff:0-ffff:b内存单元之和存入dx中:

思考:1.结果存在dx中是否会超出范围? 一个内存单元存0-255  12个内存单元不会超出16位

   2.内存单元值8位怎么累加到dx 16位中? 将8位放到al中,然后ax累加到dx中

程序:

assume cs:code
code segment

mov ax,0ffffH
mov ds,ax
mov ax,0H
mov bx,0H
mov dx,0H
mov cx,0CH
s:mov al,ds:[bx]
add dx,ax
inc bx
loop s

mov ax,4c00H
int 21H
code ends
end

5.6段前缀

mov ax,[bx]  表示将DS:bx地址字单元内容存到ax中

在汇编代码里[bx]可以加前缀:   ds:   cs:    ss:    es: 表示段地址在哪个寄存器里,这些符号就是段前缀

5.7一段安全的内存空间

1.我们需要向内存中写入内容

2.这段内存不能有数据,否则可能导致系统或其他软件出问题

3.00200H到002ffH这段空间一般不会被使用,所以向内存写入一般就写这里 

5.8段前缀的使用

假设我们要把ffff:0-ffff:b的内容复制到0:200-0:20b中:

1.取内容: mov al,[bx]

2.存内容: mov [bx],al

由于ffff和0 不在同一段里,所以取和存的时候ds需要来回切换 效率不高

我们可以设置ds=ffff , es=0,   mov al,ds:[bx]  mov es:[bx],al 来提高效率

原文地址:https://www.cnblogs.com/superzhao/p/4611300.html