汇编网首页登录博客注册
byzero的学习博客
博客首页博客互动【做检测题】论坛求助

我的博客

个人首页 |  我的文章 |  我的相册 |  我的好友 |  最新访客 |  文章收藏 |  论坛提问 |  友情链接 |  给我留言  
图片载入中
学习动态
好友圈
文章收藏
友情链接

[2010-07-14 21:01] 汇编语言——第七天

1.[bx]和内存单元的描述
    要完整地描述一个内存单元,需要两种信息:一、内存单元的地址;二、内存单元的长度(类型)。
    [bx]表示一个内存单元,它的偏移地址在bx中。
    loop有循环的含义,这个指令和循环有关。
    约定符号idata表示常量,如mov ax,[idata]代表mov ax,[1]、mov ax,[2]
                             mov bx,idata代表mov bx,1、mov bx,2
                             这些都是非法指令。
    inc bx的含义是bx中的内容加1。对应的dec bx表示bx中的内容减1
2.Loop指令
    loop指令的格式是:loop 标号,CPU在执行loop指令的时候,要进行两步操作,一、(cx)=(cx)-1;二、判断cx中的值,不为零则转至标号处执行程序,如果为零则向下执行。
    cx的值影响着loop指令的执行。
    loop指令如下段
    mov cx,11
  s:add ax,ax
    loop s
    执行loop s时,首先要将(cx)-1,然后若(cx)不为0,则向前转至s处执行add ax,ax。所以,可以利用cx来控制add ax,ax的执行次数。
3.在debug中跟踪用loop指令实现的循环程序
    大于9FFFH的十六进制数据A000H、A001H...C000H、C001H...FFFEH、FFFFH等,在书写的时候都是以字母开头的。而在汇编源程序中,数据不能以字母开头,所以要在前面加0。
    debug中可以执行用g命令使程序能够一次性执行完;在debug遇到loop指令时,可以使用p命令,debug就会自动重复执行循环中的指令,直到(cx)=0为止。
4.debug和汇编编译器masm对指令的不同处理
    debug和编译器masm对形如“mov ax,[0]”这类指令在解释上是有不同的,分别在debug和源程序中写入同样指令:如“mov al,[0]”,但debug和编译器对这类指令中的“[idata]”却有不同的解释。debug将它解释为“[idata]”是一个内存单元,“idata”是内存单元的偏移地址;而编译器将“[idata]”解释为“idata”。
    在汇编源程序中,我们要用bx来间接地给出内存单元的偏移地址,可是比较麻烦,如果要像在debug中那样,在“[]”中直接给出内存单元的偏移地址。这样做,在汇编源程序中也是可以的,只不过,要在“[]”的全面显式地给出段地址所在的段寄存器。比如我们可以这样访问2000:0单元:
mov ax,2000H
mov ds,ax
mov al,ds:[0]
    在汇编源程序中,如果用指令访问一个内存单元,则在指令中必须用“[...]”来表示内存单元,如果在“[]”里用一个常量idata直接给出内存单元的偏移地址,就要在“[]”的前面显式地给出段地址所在的段寄存器。
5.loop和[bx]的联合应用
    在实际编程中,经常会遇到,用同一种方法处理地址连续的内存单元中的数据的问题。我们需要用循环来解决这类问题,同时我们必须能够在每次循环的时候按照同一种方法来改变要访问的内存单元的地址。这是我们就不能用常量来给出内存单元的地址,而应用变量。
6.段前缀
    类似于mov ax,ds:[0];mov ax,cs:[0]这些出现在访问内存单元的指令中,用于显式地指明内存单元的段地址的“ds:”“cs:”“ss:”“es:”,在汇编语言中称为段前缀。
7.一段安全的空间
    在一般的PC机中,dos方式下,dos和其他的合法的程序一般都不会使用0:200~0:2ff(00200h~002ffh)的256个字节的空间。所以,我们使用这段空间是安全的。不过为了谨慎起见,在进入dos后,我们可以先用debug查看一下,如果0:200~0:2ff单元的内容都是0的话,则证明dos和其他合法的程序没有使用这里。
8.段前缀的使用
具体见书
评论次数(0)  |  浏览次数(881)  |  类型(汇编笔记) |  收藏此文  | 
 
 请输入验证码  (提示:点击验证码输入框,以获取验证码