Chinaunix首页 | 论坛 | 博客
  • 博客访问: 497335
  • 博文数量: 161
  • 博客积分: 6010
  • 博客等级: 准将
  • 技术积分: 1947
  • 用 户 组: 普通用户
  • 注册时间: 2007-08-25 01:20
文章分类

全部博文(161)

文章存档

2011年(44)

2010年(47)

2009年(48)

2008年(22)

我的朋友

分类:

2009-08-28 23:04:15

[bx]和loop指令
[bx]表示内存单元,[0]它的偏移地址是0
mov ax [0]    //information:偏移地址为[0],段地址从ds获得 一个完整的描述一个内存单元:内存单元地址   /   内存单元的长度
                                                                                    [0]表示偏移地址  / 长度(类型)由具体指令中的其他操作对象(寄存器)指出
loop

描述性符号()
(ax)ax寄存器的内容
()的元素 三种类型,1寄存器名2段寄存器名3内存单元的物理地址20位
应用
(ax)=0010h
(20000h)=7893H
(ax)=((ds)*16+2)   mov ax,[2]
(ax)=(ax)+2        add ax,2
()表示的数据有两种类型字节/字
al bl cl 等位数据为字节型
ds ax bx 得到的数据位字型

约定符号idata表示常量

[bx]bx寄存器中的内容位偏移地址
作业
mov ax 2000h
mov ds, ax           ; 将ds设置为2000h
mov bx, 1000h        ; 将bx寄存器设置为1000h
mov ax,[bx]          ; 将ax寄存器2000:1000h的内容00ee放入即ax=00ee
inc bx               ; bx=1001
inc bx               ; bx=1002
mov [bx], ax         ;bx=1002中的内容为(21002H)=ee (21003H)=00
inc bx               ;bx=1003
inc bx               ;bx=1004
mov [bx], ax         ;bx=1004中的内容为(21004H)=ee (21005H)=00  
inc bx               ;bx=1005
mov [bx], al         ;(21005h)=ee
inc bx               ;bx=1006
mov [bx], al         ;(21006h)=ee
loop指令
cpu进行的两部操作
1:(cx)=(cx)-1
2:判断cx的值,不为0则转到标号处执行程序
计算2^2

assume cs:code
code segment
 mov ax,2
 add ax,ax
 mov ax, 4c00h
 int 21h
code ends
end
   |
   |  
   |
assume cs:code
code segment
 mov ax,7B
 
        mov cx,ec     ;add ax,ax  ;add做11次
      s:add ax,7B     ;0006H, b->a->987654321
        loop s         ;s=0006H,偏移地址
 mov ax ,4c00h
 int 21h
code ends
end
小总结:3个要点
在cx中存放循环次数11=B即使11次
loop指令的标号所标识地址要写在前面
要循环执行的程序段,要在标号和loop指令的中间

mov cs,循环次数
s:
  循环执行的程序段
  loop s
 
实验一

assume cs:code
code segment
 mov ax,0ffffh
 mov ds,ax
 mov bx,6
 
 mov al,[bx]  ;
 mov ah,0
 
 mov dx,0
 
 mov cx,3
  s:add dx,ax ; d2d1d0 out
 loop s
 
 mov ax,4c00h
 int 21h
code ends
end
我们只跟踪循环的过程,希望可以一次执行完标号s前的指令,  debug命令g来做
g 0012
希望将循环一次执行完,p命令
再次遇到loop指令时,用p命令

debug和汇编编译器masm对指令的不同处理
mov ax,[0]   ;表示在ds:0处的数据送人ax中
 
段前缀的使用
段地址
两个段地址的应用
将内存ffff:0 ffff:b单元的数据拷贝到0:200 0:20b中
方法二!原来利用两个段寄存器来存储,循环进行复制
assume cs:code
code segment
 mov ax,0ffffh
 mov ds,ax          //init ds
 mov ax,0020h
 mov es,ax          //init es
 mov bx,0           //add avr
 mov cx,12          //set 12 number
s: mov dl,[bx]
 mov es:[bx],dl     //from ds to es
 inc bx
 loop s       
  
 mov ax 4c00H        //out
 int 21h
code ends     
end

TEST2
向内存0:200 0:23f依次传说0-63(3fh)
方法二
分析:
0:200 0:23f 等效于0020:0 0020:3f
assume cs:code2
codes segment
 mov ax ,0020h   //init ds
 mov ds,ax
 
 mov bl,0
 mov cx,64
s:      mov ds:[bx],bl
 inc bl
 loop s
 mov ax 4c00H
 int 21h
code2 ends
end

 
阅读(794) | 评论(1) | 转发(0) |
给主人留下些什么吧!~~

chinaunix网友2011-06-05 02:21:20

大连法律咨询在线 http://www.fabowang.com 大连律师在线咨询 http://www.fabowang.com 大连法律顾问网 http://www.fabowang.com 大连律师咨询 http://www.fabowang.com