自制操作系统日记(8):变量显示

代码仓库地址:https://github.com/freedom-xiao007/operating-system

简介

上篇中,我们显示了静态的字符串在桌面上,本篇进一步探索,能将定义的整型变量的值显示在桌面上

探索历程说明

本来想着应该是一两天能搞定的,但事与愿违,哎,卡的很,很不顺利,今天在看书的时候突然灵光一闪,有了其他的思路,然后尝试,发现成功了,喜极而泣,太难了

下面说说本次实现中的大坑:数字转字符串!

在书中是使用的sprintf函数,想着跟着用也没有啥问题,但结果是编译后并没有自动生成这个sprintf函数的实现!

想着去github搜一搜,复制粘贴一把,一看,这也太复杂了吧,尝试抄了,好吧,太菜了,抄不动(抄代码都不会了,艹),抄啊抄的一天时间过去了

第二天想着不就是数字转字符串吗,我自己用汇编写一个不行?然后就在网上搜索相关代码,很好,有的,复制粘贴改吧改吧,一气呵成,结果一看战绩0-8,超鬼,艹,又2天过去了

行吧,突破失败,只能积攒修为,看书,又开始翻那三本书,同时看看其他,不能一直卡在这,学点其他的

昨天晚上看go的编译器相关的东西的时候,突然灵光一闪:可以先不再桌面上显示,先调试通无桌面时字符串显示,再将数字转字符串在无桌面时显示,最后上桌面显示

不能熬夜,来一套睡前冥想,睡一觉起来再说

今天4点半醒来就开搞,噗嗤噗嗤搞了三四个小时,终于成功了,喜极而泣

下面是相关关键节点的记录说明:

实现说明

1.无桌面时打印字符串

首先看看我们不是图形化的时候是怎么打印字符串,在我们的head.asm文件中,处于32模式下的字符串显示方法如下:

mov  esi,asmmsg                 ;保护模式DS=0,数据用绝对地址访问
mov  cl, 0x09                   ;蓝色字体
mov  edi, 0xb8000+21*160        ;指定显示在某行,显卡内存地址也需用绝对地址访问     
call printnew

printnew:                       ;保护模式下显示字符串, 以'$'为结束标记
        mov  bl ,[ds:esi]
        cmp  bl, '$'
        je   printover
        mov  byte [ds:edi],bl
        inc  edi
        mov  byte [ds:edi],cl  ;字符颜色
        inc  esi
        inc  edi
        jmp  printnew
printover:
        ret

如上所示,asmmsg 是字符串,想将其地址赋给esi寄存器,然后设置颜色和位置,最后调用printnew函数,我们实现的话,也就复用这套就行了,在我们的func.asm文件中增加一个函数,如下:

_print_s:
        mov  esi,[esp+4H]                 ;保护模式DS=0,数据用绝对地址访问
        mov  cl, 0x09                   ;蓝色字体
        mov  edi, 0xb8000+22*160        ;指定显示在某行,显卡内存地址也需用绝对地址访问     
        call printnew
        RET

如上所示,[esp+4H]是我们传入变量的内存地址,这个博主是怎么知道在下面说明

下面是关于C语言函数传参和汇编NASM码的关系

没有写过汇编没有关系,咱就是抄,抄着抄着就会了,我们先编写两个函数,看看转成汇编码是什么样子的:

C代码如下:就是读入两个键盘字符串(没有实现,空的),然后将这两个字符串传入另外一个函数

int add(char* a, char* b);
char* get_char();

void start(void)
{
   

    char *a = get_char();
    char *b = get_char();
    int c = add(a, b);

    if (c == 3) {
   
        char *s = "hello world2$";
    }
}

int add(char* a, char* b<
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值