初学者往往基础知识不扎实,因此而遇到种种奇怪的错误,这种情况下,我通常就会到网上百度一下,可是,如果百度没有,我就悲催了o(╯□╰)o~~,那种感觉确实很让人不爽...
所以,再次感谢!
========================================下面是我原先的代码:===============================
assume ds:data,cs:code,ss:sta
data segment
db 'welcome to masm!' ;用si定位
db 2,36,113,122 ;用di定位
data ends
sta segment
dw 0,0
sta ends
code segment
start: mov ax,0b800h
mov es,ax
mov sp,4h
mov bx,0h
mov si,0h
mov di,10h
mov dx,0h
mov cx,4h ;4行文字
lie: push cx
mov cx,10h ;16列字符
hang: mov al,ds:[si]
mov es:[bx+di],al
mov ah,ds:[di]
mov es:[bx+di+1],ah
add dl,2h
inc si
loop hang
pop cx
mov bx,0a0h
inc di
loop lie
mov ax,4c00h
int 21h
code ends
end start
==================================下面是 坐而论道 为我改写之后的代码===========================
ASSUME DS:DATA, CS:CODE, SS:STA
;*******************************************
DATA SEGMENT
DB 'Welcome to masm!' ;共16个字符.
DB 2, 36, 113, 122
DATA ENDS
;*******************************************
STA SEGMENT
DW 16 DUP (0) ;原来的堆栈空间偏小.
STA ENDS
;*******************************************
CODE SEGMENT
START:
MOV AX, DATA ;原来的,少了这两行.
MOV DS, AX
MOV AX, 0B800H
MOV ES, AX
MOV SP, 16 ;加大堆栈空间.
MOV BX, 12 * 160 + 26 * 2 ;第一次的显示位置:第12行、26列.
MOV DI, 16 ;颜色数据指针.
;----------------------------------------
MOV CX, 4H ;准备显示4行文字.
HANG:
;-------------下面是显示一行.
MOV SI, 0 ;设定字符数据指针.
MOV DX, 10H ;每行16列字符.
LIE:
MOV AL, DS:[SI] ;取出一个字符.
MOV ES:[BX], AL ;写入显缓.
MOV AH, DS:[DI] ;取出颜色字节.
MOV ES:[BX + 1], AH ;写入显缓.
ADD BX, 2
INC SI
DEC DX
JNZ LIE
;--------------一行显示完成.
ADD BX, 160 - 32 ;加160,是转下一行,32,是刚才已经写入了.
INC DI ;换成下一种颜色.
LOOP HANG
;----------------------------------------
MOV AX, 4C00H
INT 21H
CODE ENDS
;*******************************************
END START
-----------------最后吸取教训----------------------------------------------------------------------------------------------
assume ds:data,cs:code,ss:stack
data segment
db 'welcome to masm!' ;用si定位
db 2,36,113,122 ;用di定位
data ends
stack segment stack
dw 0,0,0,0,0,0,0,0
stack ends
code segment
;==================初始化==========================================
start: mov ax,0b800h
mov es,ax
mov ax,data
mov ds,ax
mov ax,stack
mov ss,ax
mov sp,16
mov ax,0h
mov si,0h ;为数据区字符索引
mov di,10h ;为数据区属性索引
mov bx,0c0h ;显存行索引+列索引
mov cx,4h ;
;==================初始化结束=======================================
;==================循环4行==========================================
lie: push cx
mov cx,10h ;每一行16个字符
mov si,0h ;每一次打印完成一行之后,索引回到行首
hang: mov al,ds:[si] ;取字符
mov es:[bx],al ;字符装入显存
mov ah,ds:[di] ;取属性
mov es:[bx+1],ah ;属性装入显存
inc si
add bx,2
loop hang
pop cx
inc di
add bx,0a0h ;bx为行索引,此行代码为换行
sub bx,20h ;换行后回到行首列(相对来说,不是绝对行首)
loop lie
;==================循环4行结束=======================================
mov ax,4c00h
int 21h
code ends
end start
=======================================经验总结================================
1.代码没有进行合理注释(⊙﹏⊙b汗 低级问题 挺懒~~)
2.22行和24行代码出错,dx寄存器用法不正确(⊙﹏⊙b汗 低级错误 不过 平时注意不到~~)
3.审题是没有合理分配寄存器进行定位(⊙﹏⊙b汗 以后编程好像也是个问题~~)
4.代码模块不是很分明 显得很乱~~(⊙﹏⊙b汗 没办法 习惯了~~)
[课程]FART 脱壳王!加量不加价!FART作者讲授!