当前位置: 技术问答>linux和unix
帮我分析一下这段代码
来源: 互联网 发布时间:2016-05-29
本文导语: Dispstr: push ebp mov ebp, esp push ebx push esi push edi mov esi, [ebp + 8] mov edi, [Dispposdw] ; Dispposdw 是事先定义好,用来存储显示位置 mov ah, 0Fh .1: lodsb ; test al, al ; jz .2 cmp al, 0Ah ; 是回车吗? jnz ...
Dispstr:
push ebp
mov ebp, esp
push ebx
push esi
push edi
mov esi, [ebp + 8]
mov edi, [Dispposdw] ; Dispposdw 是事先定义好,用来存储显示位置
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 [Dispposdw], edi
pop edi
pop esi
pop ebx
pop ebp
ret
; DispStr 结束---------------------------------------------------
这个代码来自《自己动手写操作系统》96页
这是个子程序,用来显示一个字符串
问题如下:
1、为什么ebp+8才是字符串的地址
2、文中160的作用是什么?
push ebp
mov ebp, esp
push ebx
push esi
push edi
mov esi, [ebp + 8]
mov edi, [Dispposdw] ; Dispposdw 是事先定义好,用来存储显示位置
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 [Dispposdw], edi
pop edi
pop esi
pop ebx
pop ebp
ret
; DispStr 结束---------------------------------------------------
这个代码来自《自己动手写操作系统》96页
这是个子程序,用来显示一个字符串
问题如下:
1、为什么ebp+8才是字符串的地址
2、文中160的作用是什么?
|
那個是和顯存地址有關係的。在控制台下,屏幕是80*25的,你就想像成80*25個格子,輸出的時候就是往這些格
子裏面放字符。而一個格子由兩個字節組成,其中一個字節表示的是這個格子存的什麽字符;另一個字節平分成
兩部份,保存所存字符的屬性,也就是前景色和背景色。這樣一個格子就是兩個字節了,所以一行就是80*2=160
個字節了。
子裏面放字符。而一個格子由兩個字節組成,其中一個字節表示的是這個格子存的什麽字符;另一個字節平分成
兩部份,保存所存字符的屬性,也就是前景色和背景色。這樣一個格子就是兩個字節了,所以一行就是80*2=160
個字節了。