您的位置:首页 > 运维架构

汇编语言学习笔记(五)bx和loop指令

2014-07-04 09:06 190 查看
5.1

[bx]

和[0]类似

[0]表示偏移地址长度,段地址默认在bs中,

但是[0]在debug中跟asm中表示的不一样,[0]在asm中ml之后会变成数值0

为解决mov ax,[1]在axm编译后变成mov ax,1;可以写成mov ax,ds:[1]

四种:mov al,[0];mov al,ds:[0];mov al,[bx];mov ds:[bx]

loop:与循环有关

(ax)=0010H;用()表示ax中的内容为

2000:1000的内容为0010:(21000H)=0010H

mov ax,[2] 描述为:(ax)=((ds)*16+2);

push ax 可以描述:

(sp) = (sp)-2

((ss)*16+(sp))=(ax)

pop ax

(ax)=((ss)*16+(sp))

(sp) = (sp)+2

约定符合idata表示常量

mov ax,[idata]

mov ax,[bx]即:(ax)=((ds)*16+(bx))

INC bx inc表示(bx)自增+1

5.2 loop指令

cx默认是存放程序的大小;

loop操作要进行两个指令:

(cx)=(cx)-1

判断cx中的值,如果不为0,则跳转到标号处执行,如果为0则向下执行

2^n次方:

assume 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

三个要点:

cx存放循环次数(cx值最好是放在标号前一行)

loop指令的标号地址要放在前面

要执行的程序代码要写在标号和loop之间

实现ffff:0006单元向ax赋值

(ah)=0,(al)=(ffff6H)

mov ax,0ffffH(注意,由于汇编源程序中,数据不允许以字母开头,所以要加0)

debug引入G命令和P命令来解决循环调试问题:

如果loop指令在0012;

G 0014(偏移地址);表示之间循环完成跳转到0014处的代码;

p ;表示之间完成循环,跳转到结束后的代码

5.5loop和[bx]的联合应用

有关计算题的存储问题,一定要先考虑会不会超出存储范围;

内存单元中的数据是8位的, 不能直接加到16位中。

在多次循环中,如果仅仅是偏移地址发生变化,可以引入新的bx或者其他的通用寄存器,用来做累加

5.7一段安全的空间

随意改写内存空间很危险。

0:200h~0:2FFh是默认的安全空间

拷贝,元单元ffff:x和目标单元0:200h~0:2FFh

先将0:200~02ff表示为:0020:0~002f:f

好将偏移地址用一个变量来表示

s:mov ax,0ffffh

mov ds,ax

mov dl,[bx]

mov ax,0020h

mov ds,ax

mov [bx],dl

inc bx

loop s

因为两个数据是不同的段,所以要每次循环设置两次ds

可以借用es来将ds,ax es,ax放入循环外面
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: