[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
阅读(816) | 评论(1) | 转发(0) |