循環程序例子
示例 在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