循环程序例子
示例 在5行16列上用写显存方法显示多彩字符串。用循环指令实现。
设计思路:
(1) 用DH存放行号,DL存放列号;
(2) BL存放字符属性,第1个字符的属性为4,红色;其他字符按属性+1改变;
(3) 字符的位置计算公式:行号×160+列号×2;
(4) 用循环指令LOOP实现将多彩字符串循环写入显存 。
代码:
;a.asm 在5行16列上用写显存方法显示多彩字符串。 data segment a1 db 'Hello world!' a2 db 0 data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov dh,5 ;行 mov dl,16 ;列 mov bl,4 ;颜色属性 mov si,0 show_str: mov ax,0b800h ;显存首址 mov es,ax mov ax,160 mul dh ;行号×160 mov di,ax ;起始行位置 sal dl,1 ;列号×2,2个字节单元为1列 mov dh,0 add di,dx ;行列相加 mov cx,a2-a1 ;字符串长度 let1: mov al,[si] ;循环写字符和属性到显存 mov es:[di],al mov byte ptr es:[di+1],bl inc si inc bl ;属性加1 add di,2 ;写完即显示完 loop let1 ;循环指令 mov ah,4ch int 21h code ends end start
排序
冒泡排序,使用双重循环。
设计思路:
(1) 用两条LOOP指令实现双重循环时,对CX寄存器有冲突。采用PUSH CX指令将外循环的CX值入栈保存,内循环的LOOP结束后,再将外循环的CX恢复;
(2) 用寄存器相对寻址取出两数进行比较。
程序框图:
代码:
; b.asm 将字数组part按升序排序 data segment part dw 15,32,6,-27,8 sign dw ? data ends code segment assume cs:code,ds:data start: mov ax,data mov ds,ax mov cx,sign-part ;数组长度 shr cx,1 ;元素个数 dec cx loop1: ;外循环 push cx ;保存外循环次数 mov bx,0 loop2: ;内循环 mov ax,part[bx] cmp ax,part[bx+2] ;比较大小 jle next ;升序 xchg ax,part[bx+2] ;交换 mov part[bx],ax next:add bx,2 loop loop2 pop cx ;恢复外循环次数 loop loop1 mov ah,4ch int 21h code ends end start