小程序转换成网页/海阳seo排名优化培训
五、[bx]和loop指令
5.1 使用bx寄存器访问数据段
1)[bx]和[0]使用方法类似
要完整的描述一个内存单元的信息:
-
内存地址(段地址:偏移地址)
-
内存单元的长度(类型)
用[0]表示一个内存单元时,0代表偏移地址,段地址默认在ds寄存器中,单元的长度(类型)由具体指令中其他操作对象(寄存器等)给出。
assume cs:codesgcodesg segmentmov ax,2000Hmov ds,axmov bx,10Hmov ax,[0]mov ax,[bx]mov ax,4c00Hint 21Hcodesg endsend
2)inc(increase的缩写)(自增指令)
mov bx,1
inc bx
; bx = 1 + 1 = 2
5.2 loop 指令
通过一个案例引入loop,在地址20000H~2000FH写入0123456789ABCDEF(使用jmp指令,但是会无限执行下去)
assume cs:codesgcodesg segmentmov ax,2000Hmov ds,axmov bx,1000Hmov dl,00H
jmp_pos: mov [bx],dlinc dlinc bxjmp jmp_pos ;标号(内存地址)mov ax,4c00Hint 21Hcodesg endsend
1)loop(循环指令)
loop的格式:loop 标号
- cx–
- 判断cx是否>0,是执行跳转,否则继续向下执行
改进上面程序:
assume cs:codesgcodesg segmentmov ax,2000Hmov ds,axmov bx,1000Hmov dl,00Hmov cx,16 ;cx寄存器保存循环次数 ;loop之前的语句会无条件执行一次;如果cx初始化为0,遇到loop指令,先cx--,;此时cx = ffff,然后就会出现越界问题
loop_pos: mov [bx],dlinc dlinc bxloop loop_pos ;标号(内存地址)mov ax,4c00Hint 21Hcodesg endsend
注意:cx不能初始化为 0,否则在使用loop指令时就会出现越界问题
2)计算ffff:6单元内的值*3放在dx中
;计算ffff:6单元内的值*3放在dx中
assume cs:codesgcodesg segmentmov ax,0ffffHmov ds,axmov bx,6mov al,[bx]mov ah,0mov cx,3mov dx,0loop_code: add dx,axloop loop_codemov ax,4c00Hint 21Hcodesg endsend
注意:在汇编程序中,数据不能以字母开头,比如ffffH,需要在前面加个0,写成0ffffH
3)将内存FFFF:0FFFF:F中的数据放在0:2000:20f(20:0~20:f)中
- 使用栈段
assume cs:codesg
codesg segmentmov ax,0ffffhmov ds,axmov bx,0mov cx,16
code_loop: push dsmov dl,[bx]mov ax,20Hmov ds,axmov [bx],dlinc bxpop dsloop code_loopmov ax,4c00hint 21h
codesg endsend
- 或者:不使用栈段
assume cs:codesg
codesg segmentmov bx,0mov cx,16
code_loop: mov ax,0ffffhmov ds,axmov dl,[bx]mov ax,20Hmov ds,axmov [bx],dlinc bxloop code_loopmov ax,4c00hint 21h
codesg endsend
- 使用es寄存器
assume cs:codesg
codesg segmentmov ax,0ffffhmov ds,axmov ax,20Hmov es,axmov cx,16
code_loop:mov dl,ds:[bx]mov es:[bx],dlinc bxloop code_loopmov ax,4c00hint 21h
codesg endsend
- 123都是一次传送一个字节的数据,这次直接使用dx寄存器传送字型数据
assume cs:codesg
codesg segmentmov ax,0ffffhmov ds,axmov ax,20Hmov es,axmov cx,8code_loop:mov dx,ds:[bx]mov es:[bx],dxadd bx,2loop code_loopmov ax,4c00hint 21h
codesg endsend
4)向0:200~23f中依次传入0~63
assume cs:codesg
codesg segmentmov ax,20Hmov ds,axmov cx,63mov bx,0
code_loop:mov ds:[bx],blinc bxloop code_loopmov ax,4c00Hint 21hcodesg endsend
5)将“mov ax,4c00H”前的指令复制到0:200处
assume cs:codesgcodesg segmentmov ax,cs;mov ax,csmov ds,axmov ax,20Hmov es,axmov bx,0mov cx,23; mov cx,
code_loop:mov al,ds:[bx]mov es:[bx],alinc bxloop code_loopmov ax,4c00hint 21hcodesg endsend
4C00H”前的指令复制到0:200处
assume cs:codesgcodesg segmentmov ax,cs;mov ax,csmov ds,axmov ax,20Hmov es,axmov bx,0mov cx,23; mov cx,
code_loop:mov al,ds:[bx]mov es:[bx],alinc bxloop code_loopmov ax,4c00hint 21hcodesg endsend