[bx]和loop指令
在汇编语言中[]中的内容一般都是数字或运算表达式,整个的[]和里边的内容表示了内存地址。例如 mov al,[0]代表把[0]地址处信息传送到al中去。 loop引文意思是循环的意思,在汇编语言中是一条循环指令。以后的学习主要以编程实例为主,很少再对指令等进行解释。
loop指令执行时进行的操作:判断cx是否为零。若是不为零则进行 cx=cx-1;进行循环语句的执行。若是cx为零,则就跳过循环执行下边的操作,
编程任务 计算2^2,结果存放到ax中去
assume cs:code
code segment
start: mov ax,0
mov cx,2
s:add ax,2
loop s
mov ax,4c00h
int 21hcode endsend start由于根据课程我们还没有学习到乘法指令,所以就用加法指令来执行此操作,由此可以看出 cx中存放的是程序循环的次数,我们要进行循环操作,首先要建立一个循环标号(程序中的s 从标号到loop指令中间的都是要循环的内容,)例如我们要进行那个计算2^12的运算则就要进行如下的编程assume cs:codecode segmentstart:mov ax,2mov cx,12s:add ax,axloop smov ax,4c00hint 21hcode endsend start比较着两个程序的不同,从而注意cx的变化,再循环中cx的内容决定了循环次数,而loop指令先要进行的操作是cx=cx-1.在进行判断cx是不是为零,下面我们用debug来跟踪程序的执行,当然我们也是要把程序编译连接好了才能进行对程序的debug,本人认为对可执行文件的debug就像是进行反汇编操作,为了方便我们就计算2^4的程序来进行debug操作,这些操作也是在dos窗口下操作的,程序:assume cs:codecode segmentstart: mov ax,2 ;ax=2mov cx,3s:add ax,axloop s ;展开看:@cx=cx-1(cx=2)执行ax=ax+ax(ax=4)@cx=cx-1(cx=1)执行ax=ax+ax(ax=8)mov ax,4c00h ;@cx=cx-1(cx=0判断到cx=0)不再执行循环int 21hcode endsend start截图如下
额本人犯了一个错误,其实我们没有注意到,语句 s:add ax,2 loop s在执行循环之前我们已经执行了一次 loop ax,2 所以我们应该将cx的值-1才能得到我们想要的结果,所以这个错误导致了截图中到最后ax=8时 cx=2而不是1.惭愧我不是全才犯错了,o(╯□╰)o呵呵见谅。。现在以上的分析都正确了(本人认为)如有错误请求之争谢谢。。当然截图中的 运用t命令的上一行现实的就是我们的汇编语句。再次唠叨一边这些操作的前提是我们的文件和我们运用的软件必须在同一个目录下。前边我们介绍了[bx]现在我们就充分解释一下他呗,我们知道bx是基址寄存器这样用是表示偏移地址。前边我们编的程序并没有访问内存单元。当我们访问内存单元的时候我们总需要一个器件来标识内存地址,此时[bx]就起到了如此的作用由于bx内的信息可以修改,所以我们可以连续的访问内存,当然这个就需要loop指令的配合了。......例如我们将内存地址单元0123:0-0123:9这10个内存单元的数值加到ax中去,则我们的程序可以写成如下的代码。assumecs:code
code segment
start: mov ax,123
mov ds,ax ; 将段地址传送给ds
mov ax,0 ;对ax清零
mov cx,9
mov bx,0 ; 设置偏移地址
s:add ax,[bx] ;开始相加
inc bx ;偏移地址起作用或者写成add bx,1
loop s
mov ax,4c00h
int 21h
code ends
end start
截图如下。。。。
这是程序的最终结果,我们可以清晰地看到bx的值到了9,,呵呵这次我没有反伤一次的错误,,因为下一条的指令是 nop..此处我们简单介绍一下段超越前缀,,就是我们在偏移地址的前边加上段地址例如: cs:[bx]则此时的段地址就是代码段了 ds:[bx]此时就是数据段。呵呵就这样,,今天就结束了。。不过弱弱地说随着以后程序的复杂我可能还会犯错误也可能自己不能改正,请求读者斧正谢谢。。。