汇编的这个程序怎么实现循环?

来源:百度知道 编辑:UC知道 时间:2024/05/26 15:40:42
;定义数据段
data segment
;在这里定义内存变量
var8 db 11010011b ;可以改变var8的值,以检验print_bin是否仍正常工作。
data ends

;编写代码段
code segment
assume cs:code, ds:data ;指定数据段与代码段。
start: mov ax, data ;将数据段的偏移址写入ax。
mov ds, ax ;通过ax将数据段偏移址写入数据段寄存器
;以使mov指令在进行与内存变量有关的操作时
;可正确定位内存变量地址。

mov al, var8 ;将var8的值送入AL寄存器。
call print_bin ;调用子程序输出AL的2进制形式。
deadloop:
jmp deadloop

print_bin proc
mov ah,10000000b
test ah,00000001b
jz Lmov
exit:
Lmov:shr ah,1
push ax
test al,ah
jz zero
mov al,'1'
jmp about
zero:mov al,'0'
about:mov dl,al
mov ah,02h
int 21h
pop ax ;将AL中的数以2进制形式输出到屏幕。

这个程序是你自己写的吗,程序问题很多呢,没法实现循环,只执行一次就退出了。
这样修改一下:
data segment
var8 db 01111011b
data ends

code segment
assume cs:code, ds:data
start: mov ax, data
mov ds, ax
mov al, var8
call pnbin
mov ah,4ch
int 21h
;以上两行原来是死循环,不能正常结束

pnbin proc
mov ah,10000000b
next: test ah,ah ;要是用你原来的循环控制方式只能执行7次
jz exit ;改成这样就可以了
push ax
test al,ah
jz zero
mov al,'1'
jmp about
zero: mov al,'0'
about: mov dl,al
mov ah,02h
int 21h
pop ax
shr ah,1
jmp next ;这里是显示完一个位,这时应跳转到开始判断是否结束循环,而不应该直接结束。
exit:
ret
pnbin endp
code ends
end start
你原来的程序构成循环是想这样实现,把10000000和00000001相与,结果不为零就把10000000左移一位然后循环,然后再判断,再左移,再循环。这样实际上循环7次就结束了。
做过改动的地方都加了注释,这个循环的形成主要是判断ah的内容是不是0,如果不是零,就把ah右移一位,然后执行一次循环体,然后再判断,再执行,直到ah为零为止。

其实没有必要这么麻烦啊,把子程序这样写不是更好一些吗?
pnbin proc
mov cx,8
next: