一个死循环问题
什么原因造成内循环才刚循环一次还没完,到了loop s1的时候cx突然变成F?
assume cs:codesg,ds:datasgdatasg segment db 'welcome to masm!' db 02h,24h,71hdatasg endsstack segment dw 8 dup(0)stack endscodesg segmentstart:mov ax,datasg mov ds,ax mov ax,stack mov ss,ax mov sp,10h mov ax,0b8720h mov es,ax mov bx,0 mov si,0 mov di,1 mov bp,10h mov cx,3 s: push cx mov cx,10h s1: mov ah,ds:[bx] mov es:[si],al mov al,ds:10[bp] mov ds:[di],al inc bx inc bp add si,2 add di,2 loop s1 add bx,10h pop cx loop s add ax,4c00h int 21hcodesg endsend start
1 assume cs:code,ds:data 2 data segment 3 db 'welcome to masm!' 4 db 02h,24h,71h 5 data ends 6 code segment 7 start: 8 mov ax,data ;指定数据段DS 9 mov ds,ax 10 mov ax,0b800h ;显示区域为附加段ES 11 mov es,ax 12 mov di,780h ;ES:DI起始行 13 mov bx,10h ;颜色属性,地址为:DS:[BX] 14 mov cx,3 ;3个颜色 15 a: ;外循环对3中颜色循环, 依次是02,24h,71h 16 push cx ;由于内循环要用到cx,故保存 17 push di ;保存初始行 18 mov si,0 :字符首地址ds:si 19 mov cx,16 ;内循环开始,依次遍历16个字符 20 b: mov al,[si] ;将asacii放入al 21 mov ah,[bx] ;将属性放入ah 22 mov es:[di+40h],ax ;显示 23 inc si ;指向下一个字符 24 add di,2 ;指向下一个显示位置 25 loop b ;如cx=0,则内循环结束 26 pop di ;第一次循环结束,恢复初始行的值 27 pop cx ;恢复cx 28 inc bx ;ds:[bx+1],指向下一个属性 29 add di,0a0h ;第二行 30 loop a ;外循环,如3个属性遍历完毕则跳出循环 31 32 mov ah,4ch 33 int 21h 34 code ends 35 end start