首先一点, switch(c++)
是先取值,再自加。 所以当c='A'的时候, 执行case 'A', 而不是case 'B',
所以, 依次为
c='A' k++, k=1 退出switch 后 再次自加, k=2
'B': k--后k+=3, k=4,然后,switch外面的k++, k=5
'C': k+=3后 k++, k=9
'D':k%=2; k=1 注意这里是continue, 所以没有后面switch外的k++了。
'E':k=10 k=10 自加 k=11
'F': k=k/2=5 然后switch后面 k++, k=6
此时c已经自加过,c='G'退出循环。
输出k=6
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH
MOV R2,#10
LOOP:
MOV P0,A
LCALL DELAY
MOV P0,#0FFH
LCALL DELAY
DJNZ R2,LOOP
MOV R2,#10
RL A
SJMP LOOP
DELAY:
MOV R3,#200
DLY:
MOV R4,#250
DJNZ R4,$
DJNZ R3,DLY
RET
END
#include <stdioh>
int main()
{
int i,n;
for(i=-3;i<=3;i++)
{
n=i>0i:-i;
printf("%s\n",7-n,7-2n,"");
}
return 0;
}
主要程序片段如下:
disBuffer db '123456$' ;要显示的字符串
col db 5 ;在屏幕上的位置
row db 10
main:
mov ax,200h
mov bx,0
mov dl,[col]
mov dh,[row]
int 10h ;以上几行用于定位当前光标位置
lea dx,disBuffer
mov ax,0900h
int 21h ;显示字符串;
call funcRL ;
mov cx,1 ;延时控制,可以根据要求设置1、2、3……
call funcDelay ;
mov ah,0bh
int 21h ;看下键盘有无输入,如果有就退出程序
or al,al
jz main ;没有输入,去继续循环
mov ax,4c00h
int 21h
funcRL: ;左移一位的子程序
push ax
push cx
push si
mov cx,5
lea si,disBuffer
mov bl,[si]
inc si
RlLoop:
mov al,[si+1]
mov [si],al
inc si
loop RlLoop
mov [si],al
pop si
pop cx
pop ax
ret
funcDelay: ;; 延时子程序,如果没有延时,太快了,无法看清字符
push bx
push cx
push dx
dLoop1:
mov bx,1000h
dLoop2:
mov dx,0ffffh
dLoop3:
sub dx,1
jnz dLoop3
sub bx,1
jnz dLoop2
loop dLoop1
pop dx
pop cx
pop bx
ret
程序没有调试,大意如些。希望能帮到你。
这个程序是你自己写的吗,程序问题很多呢,没法实现循环,只执行一次就退出了。
这样修改一下:
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:
shl al,1
push ax
jc disp1
mov dl,'0'
jmp disp
disp1:
mov dl,'1'
disp:
mov ah,2
int 21h
pop ax
loop next
ret
pnbin endp
;(1) 片内从30H起始的连续10个单元内容送21H,22H,23H....2AH,
; 求和后送40H,
ORG 0000H
MOV R0,#30H
MOV R7,#10
MOV A,#21H
LOOP:
MOV @R0,A
DJNZ R7,LOOP
MOV R0,#30H
MOV R7,#10
MOV A,#00H
LOOP:
ADD A,@R0
DJNZ R7,LOOP
MOV 40H,A
SJMP $
;############################
;(3) 如果看成字来进行5个字的数据加法求和,结果放在40H和41H里面低位低字节,
;高位高字节求和。
ORG 0000H
MOV R0,#30H
MOV R1,#31H
MOV 40H,#00H
MOV 41H,#00H
MOV R7,#5
LOOP:
MOV A,40H
ADD A,@R0
MOV 40H,A
MOV A,41H
ADDC A,@R1
MOV 41H,A
INC R0
INC R0
INC R1
INC R1
DJNZ R7,LOOP
SJMP $
以上就是关于简单的循环程序全部的内容,包括:简单的循环程序、用汇编语言编制循环闪烁灯程序、C语言编程循环程序!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)