标号s开始是子程序的内容,通过jcxz得到字符串长度,作为循环次数。
;说明:在指定的位置,用指定的颜色,显示一个用0结束的字符串
;参数:(dh)=行号(取值范围0-24),(dl)=列号(0-79) (cl)=颜色 ds:si指向首地址
;返回:无
assume cs:code
data segment
db 'welcome to masm'
data ends
stack segment
dd 16 dup (0)
stack ends
code segment
start:mov ax,stack
mov ss,ax
mov sp,64
mov dh,8
mov dl,3
mov cl,02h
mov ax,data
mov ds,ax
mov si,0
call s
mov ax,4c00h
int 21h
s:push si
push ax
push bx
push cx
push dx
push es
mov bl,cl ;由于cx要使用必须首先传递值到bl中
push si
s3:mov cx,0
mov cl,[si]
jcxz s1
inc si
jmp s3
s1:mov cx,si ;取得了字符串长度,作为循环次数(已验证正确性)
pop si ;还原si到初始值(已验证正确性)
mov ax,0b80ah
mov es,ax
mov al,80
mul dh
mov dh,0
add ax,dx ;通过((dh)x80+dl)x2算出了偏移地址
add ax,ax
mov di,ax
s2:mov al,[si]
mov es:[di],al
mov es:[di+1],bl
inc si
add di,2
loop s2
pop es
pop dx
pop cx
pop bx
pop ax
pop si
ret
code ends
end start
- [游客] 没问题。继续。 04/15 08:58
- [游客] 嗯。挺好,不过,图看着有点乱。 04/15 08:56
- [bslg123] 很不错,博主已经意识到灵活的定位内存,既然已经意识到那是不是可以在进一步优化代码呢。把你的程序在进行 04/09 09:01
- [younggay] 嗯。不错,其实,还可以做两次循环,先把a段的值复制到c段,然后,将b段的值加到C段上。 04/03 11:03
- [younggay] 没问题。 04/03 10:59
- [mouse] 等你学到第六章start标号就有更感性的认识了~ 03/31 18:54
- [crazyman] ip初始值是否一定是0 ========== 不一定。程序最后的end 标号 这个指令是知名程序 03/31 16:56
- [crazyman] 是bl,还是bx?为统一起见,最初都使用bl,但发现 ds:[bl]是不合法的表达,修改了一下。 03/31 15:00
[ 游客 发表于 2009-04-15 08:58 ]
没问题。继续。