(第三章 11)精打细算用内存——DispStr函数显示字符串
(第三章 11)克勤克俭用内存——DispStr函数显示字符串
DispStr调用方法:
[SECTION .data1]
[BITS 32]
...
_szPMMessage: db "In Protect Mode now. ^-^",0Ah,0Ah,0 ;保护模式显示
szPMMessage equ _szPMMessage - $$
push szPMMessage
call DispStr
add esp, 4
DispStr实现:
DispStr:
push ebp
mov ebp, esp ;-->esp中放的是TopOfStack指针,指向栈顶(高地址)
push ebx
push esi
push edi
mov esi, [ebp+8]
mov edi, [dwDispPos]
;_dwDispPos: dd (80 * 6 + 0) * 2; 屏幕第6行, 第0列,是屏幕上下一个显示的位置
;dwDispPos equ _dwDispPos - $$
mov ah, 0Fh
.1:
lodsb ;lodsb-->将esi中的一个字节放到AL中
test al, al
jz .2 -->不是结束字符0
cmp al, 0Ah;
jnz .3 -->是“非回车的字符”
;是“回车”的时候
... ;作回车需要的相应处理
.3:
mov [gs:edi], ax
add edi, 2
jmp .1
.2:
mov [dwDispPos], edi
pop edi
pop esi
pop ebx
pop ebp
ret
DispStr调用方法:
[SECTION .data1]
[BITS 32]
...
_szPMMessage: db "In Protect Mode now. ^-^",0Ah,0Ah,0 ;保护模式显示
szPMMessage equ _szPMMessage - $$
push szPMMessage
call DispStr
add esp, 4
DispStr实现:
DispStr:
push ebp
mov ebp, esp ;-->esp中放的是TopOfStack指针,指向栈顶(高地址)
push ebx
push esi
push edi
mov esi, [ebp+8]
mov edi, [dwDispPos]
;_dwDispPos: dd (80 * 6 + 0) * 2; 屏幕第6行, 第0列,是屏幕上下一个显示的位置
;dwDispPos equ _dwDispPos - $$
mov ah, 0Fh
.1:
lodsb ;lodsb-->将esi中的一个字节放到AL中
test al, al
jz .2 -->不是结束字符0
cmp al, 0Ah;
jnz .3 -->是“非回车的字符”
;是“回车”的时候
... ;作回车需要的相应处理
.3:
mov [gs:edi], ax
add edi, 2
jmp .1
.2:
mov [dwDispPos], edi
pop edi
pop esi
pop ebx
pop ebp
ret