基本用法
mov edi, (80*2 + 0) * 2 ;屏幕第10行,第0列
mov ah, 0Ch ;0000:黑底 1100:红字
mov al, 'z'
mov [gs:edi], ax
DspStr
DspStr:
push ebp
mov ebp, esp
mov esi, [ebp + 8] ; pszInfo
mov edi, [disp_pos]
mov ah, 0Fh
.1:
lodsb
test al, al
jz .2
cmp al, 0Ah ; 是回车吗?
jnz .3
push eax
mov eax, edi
mov bl, 160
div bl
and eax, 0FFh
inc eax
mov bl, 160
mul bl
mov edi, eax
pop eax
jmp .1
.3:
mov [gs:edi], ax
add edi, 2
jmp .1
.2:
mov [disp_pos], edi
pop ebp
ret
lodsb将字符串中的字符取到al中;
test al, al
字符串结束符'\0'的ascii值是0,此时test控制为0,jz成立;
DspStrFixPos
DspStrFixPos:
push ebp
mov ebp, esp
mov ebx, [ebp + 8] ; pszLine
mov [disp_pos_2], ebx
mov esi, [ebp + 12] ; pszInfo
mov edi, ebx;[disp_pos_2]
mov ah, 0Fh
.1:
lodsb
test al, al
jz .2
cmp al, 0Ah ; 是回车吗?
jnz .3
push eax
mov eax, edi
mov bl, 160
div bl
and eax, 0FFh
inc eax
mov bl, 160
mul bl
mov edi, eax
pop eax
jmp .1
.3:
mov [gs:edi], ax
add edi, 2
jmp .1
.2:
;mov [disp_pos_2], edi
pop ebp
ret
调用:
PUBLIC void cstart(){
//DspStrFixPos((80*20+0)*2, str0);
DspStrFixPos((80*24+0)*2, str1);
//sprintf(buf, "hello os printk year is %d, month is %d, day is %d\n", 2020, 11, 8);
//DspStrFixPos(12, buf);
//sprintf(buf, "hello os sprintf, time is %d:%d\n", 14, 38);
//DspStrFixPos(13, buf);
}
效果:

因此,VGA文本模式下,25行(0、1、2、...、24),每行80个字符。
网友评论