以下是文字提取部分,阅读完毕的同学可以离开了
我们之前讲过
将;2字节;的内容放入ax的指令是
mov ax,[0]
这个偏移地址同样可以表示为bx
mov ax,[bx]
它的;段地址;依然在ds中
以后;idata;这个词代表常量
mov ax,[idata]代表偏移地址是;常量;
我以后用()表示一个寄存器或内存单元的;内容;
称;(ax);为ax中的内容
这就好比穿衣服
loop顾名思义是;循环操作;
执行loop时会有两部操作
;(cx)=(cx)-1;
;(cx);如果为0转到标号处,反之继续执行
下面的s就是所谓的;标号;
这个程序要计算2^12
注意:汇编中;不能;以字母开头
A000H要写成;0;A000H
debug时候使用;p;可以自动执行loop
debug时使用g可以在;指定位置开始;执行程序
Debug和Masm对指令的处理是;不一样;的
比如mov al,[0]
debug认为把;ds:0;的内容放入al
但masm却认为把;0;放入al
如果想实现把;内存单元;放入al
你得mov bx,0 mov al,[bx]
或者mov al,ds:[0]
如果你想把ffff:0~ffff:b内存单元中的;数据累加;到dx
请问可以吗?如何做?
我们先分析一下;数据大小;
8bit的最大值是;FFH;
FFH×(b+1)=;BF4H;
而dx是16bit,最大数据是;FFFFH;
显然;可以存下;
但是有个问题:;dx是16bit;
内存单元中的数据是8bit
如果用mov dx,[0]
显然要放;两个内存单元的数据;才够dx挥霍
于是很不争气地成了下面这样
但是改用dl的话
显然dl是8bit,最大数据是:;FFH;
聪明的你有没有什么;好想法呢;
你可以把数据存储在;al;里
然后;ah置零;,此时数据:00FFH
再;累加到dx;
最后程序是这样的
inc操作是;加一;
之前的操作,段地址都是;默认在ds中;
其实我们也可以显式指出
mov ax,ds:[bx]
mov ax,cs:[bx]
mov ax,ss:[bx]
mov ax,es:[bx]
这些;ds:,cs:,ss:,es:;
我们称为段;前缀;
段前缀是用来解决下面这样的问题
网友评论