浏览代码

实现字符串打印 put_str

simon 1 年之前
父节点
当前提交
195f359fc8
共有 3 个文件被更改,包括 31 次插入11 次删除
  1. 1 10
      kernel/main.c
  2. 25 0
      lib/kernel/print.S
  3. 5 1
      lib/kernel/print.h

+ 1 - 10
kernel/main.c

@@ -2,16 +2,7 @@
 
 int main(void)
 {
-    put_char('k');
-    put_char('e');
-    put_char('r');
-    put_char('n');
-    put_char('e');
-    put_char('l');
-    put_char('\n');
-    put_char('1');
-    put_char('\b');
-    put_char('3');
+    put_str("I am kernel\n");
     while (1)
         ;
     return 0;

+ 25 - 0
lib/kernel/print.S

@@ -20,6 +20,7 @@ BACKSPACE equ 0x8
 [bits 32]
 section .text 
 global put_char ; 导出为全局符号
+global put_str  
 ;------------------------ put_char -----------------------------------------------
 ; 功能描述: 把栈中的 1 个字符写入光标所在处
 ;---------------------------------------------------------------------------------
@@ -133,3 +134,27 @@ put_char:
 .put_char_done:
     popad 
     ret
+
+;------------------------ put_str -----------------------------------------------
+; 功能描述: 通过 put_char 来打印以 0 字符结尾的字符串 
+;---------------------------------------------------------------------------------
+; 输入:栈中参数为打印的字符串
+; 输出:无
+put_str:
+    push ebx             ; 备份 ebx
+    push ecx             ; 备份 ecx
+    xor ecx, ecx         ; 清空 ecx
+    mov ebx, [esp + 12]  ; 从栈中得到待打印的字符串地址
+.goon:
+    mov cl, [ebx] 
+    cmp cl, 0            ; 如果处理到了字符串尾巴,跳到结束处返回
+    jz .str_over
+    push ecx             ; 为 put_char 传递参数
+    call put_char
+    add esp, 4           ; 回收参数所占的栈空间
+    inc ebx              ; 使 ebx 指向下一个字符
+    jmp .goon
+.str_over:
+    pop ecx
+    pop ebx
+    ret

+ 5 - 1
lib/kernel/print.h

@@ -3,6 +3,10 @@
 
 #include "stdint.h"
 
+/// @brief 打印字符
+/// @param char_ascii ascii 字符
 void put_char(uint8_t char_ascii);
-
+/// @brief 打印字符串
+/// @param message 字符串地址
+void put_str(char *message);
 #endif // __LIB_KERNEL_PRINT_H