30天自制操作系统:第四天 C语言与画面显示的练习

本文介绍了如何在C语言中实现内存写入,通过汇编函数_write_mem8展示了参数压栈的过程。讨论了位运算在创建条纹图案中的作用,并解释了指针在内存操作中的重要性。文章通过示例代码阐述了C语言中指针的使用和类型转换,以及在汇编层面如何对应。同时提到了CPU的中断标志和端口通信的概念,最后探讨了颜色模式和调色板的设置。
摘要由CSDN通过智能技术生成

1.用C语言实现内存写入(harib01a)

章节开始展示了一个用于写入内存的汇编函数: _write_mem8
在这里插入图片描述
对于注释: [ESP + 4]存放的是地址解释:
函数调用的时候参数的压栈顺序是从右到左的,因此有如下结构:

  1. 初始情况假设栈底位置为0x1008,(SS不重要,这里只是做出了标注,并没有给出数值),那么SP寄存器的值应该是栈的最高地址 + 1,0x1008 + 1 = 0x1009,如图

在这里插入图片描述

  1. 栈压入一个参数,如果有汇编基础这块应该好理解,没有也没关系,这里给出压栈CPU执行的指令:
    在这里插入图片描述
    其实很简单,首先SP指针往“上”移动参数大小(字节)个位置,在这里因为用的是ESP,32位拓展寄存器,因此操作的单位数为4字节,也就是SP = SP - 4,然后再将参数data写入到栈中,如图:
    在这里插入图片描述

  2. 压入第二个参数 addr,与第个二步骤一样:
    在这里插入图片描述

  3. 压入返回地址:将当前代码区调用指令的下一条指令地址压入栈中,供函数返回时继续执行
    在这里插入图片描述
    更多有关函数调用时如何压栈请点击:函数调用过程中栈到底是怎么压入和弹出的?

到此,就能够理解为什么第一个参数存放的位置是 [ESP + 4] 了吧,跟栈的特点有关(栈从高地址向低地址压入元素)以及push指令的执行。
依次类推,要访问data参数,那么需要偏移2 * 4 = 8:[ESP + 8]

函数类似于C语言中的"write_mem8(0x1234, 0x56);“语句,执行动作相当于"MOV BYTE[0x1234], 0x56”,也就是将数值0x56写入到0x1234内存字节单元中。

想要取得用参数指定的数值0x1234或0x56的内容,就用MOV读入寄存器。因为CPU已经是32位模式,所以我们积极用32位寄存器,16位寄存器也可以使用, 不过机器语言的字节数会增加,执行速度也会变慢。

在指定内存的时候,如果使用16位寄存器:[CX] 或 [SP] 之类的就会出错,但使用32位寄存器,类似:[ECX]、[ESP]都没问题。

需要注意:如果与C语言联合使用,有的寄存器可以自由使用,有的寄存器不能随便使用,能自由使用的只有 EAX、ECX、EDX 这三个,至于其他寄存器,只能使用其值,而不能改变其值,因为这些寄存器在C语言编译后后生成的机器语言中,用于记忆非常重要的值。因此这次我们只用EAX和ECX。


如下图,作者还在naskfunc.nas增加了这条语句(描黑部分):

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

nepu_bin

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值