8086汇编语言程序设计——循环

循环程序例子

示例 在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

猜你喜欢

转载自www.cnblogs.com/lfri/p/10785026.html