从汇编语言写到c语言

好了,言归正传,裸机程序没有操作系统的支持,想要用c语言,就只能先使用汇编语言手动配置c语言需要的环境,听起来很高大上,其实需要做的很简单:指定堆栈指针的值就好。

那么完成这个简单的事情之前,先要明白c语言的栈的以下几个概念:

1. 空栈和满栈:这两个概念不是说的栈是空的还是满的,空栈是指栈指针指向的是栈顶元素的下一个地址。满栈指的是栈顶指针指的是栈顶元素。

2. 升栈和降栈:升栈就是栈向上生长,降栈就是栈向下生长。

注:arm是满降栈。

3. 栈帧:这个有必要好好理解一下,C语言中,每个栈帧对应着一个未运行完的函数。可以理解成像ucos那样:每个进程都有一段独立的栈空间,这段独立的空间就是栈帧。但是c语言中的栈帧是一个连着一个的,比如a函数调用b函数,那么b函数执行的时候,a函数的栈帧下面就是b函数的栈帧,b函数执行完,sp上移,完成出栈。

如下图(main函数调用func1):所有栈帧串联起来,就是完整的栈。最新的栈帧上边界由FP指针确定,下边界由sp指针指定,其中LR和SP分别指向这个栈帧对应的函数的调用者的栈帧的上下界。

来自为知笔记(Wiz)

时间: 2024-10-18 18:22:06

从汇编语言写到c语言的相关文章

单片机的汇编语言与嵌入式C语言的比较

零基础从C语言入手.在书上看到单片机的汇编语言与嵌入式C语言的比较,比较有用. 1.嵌入式C程序中的主函数是汇编程序中的主程序:嵌入式C程序中的函数是汇编程序中的子程序.程序运行都是从主函数或主程序开始,并终止于主函数或主程序中的最后一条语句.但是在编写方面,汇编程序中的主程序必须编写在整个程序的最前面,因为汇编程序运行是从整个程序中的第一行开始:而嵌入式C程序中的主函数可以放在程序的前面,也可放在后面或其他位置,无论主函数在什么位置,程序运行时都会先自动找到主函数,并从主函数中的第一条语句开始

C语言代写,C语言作业代写,代写C语言,C语言编程代写

C语言代写,C语言作业代写,代写C语言,C语言编程代写 我是一线IT企业程序员,目前接各种代码代写业务: 代写C语言.代做C语言.C语言作业代写.C语言代写 代写C++.代做C++.C++作业代写.C++作业代写 代写Python.代做Python.Python作业代写.Python作业代做 代写Java.代做Java.Java作业代写.Java作业代做 代写编程作业.代做编程.编程代写.编程代做 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一!(涉及图形化界面.或领域类知识如金融数

代写C语言,C语言代写,C语言作业代写,C语言编程代写

代写C语言,C语言代写,C语言作业代写,C语言编程代写 我是一线IT企业程序员,目前接各种代码代写业务: 代写C语言.代做C语言.C语言作业代写.C语言代写 代写C++.代做C++.C++作业代写.C++作业代写 代写Python.代做Python.Python作业代写.Python作业代做 代写Java.代做Java.Java作业代写.Java作业代做 代写编程作业.代做编程.编程代写.编程代做 先写代码再给钱,不要任何定金!价钱公道,具体见图,诚信第一!(涉及图形化界面.或领域类知识如金融数

写出C语言的地址对齐宏ALIGN(p,alignbytes),其中p是要对齐的地址,alignbytes是要对齐的字节数(2的N次方),比如说:ALIGN(13,16)=16

写出C语言的地址对齐宏ALIGN(p,alignbytes),其中p是要对齐的地址,alignbytes是要对齐的字节数(2的N次方),比如说:ALIGN(13,16)=16. 答案:#define ALIGN(p,alignbytes) ((void*)(((unsigned long)p+alignbytes-1)&~(alignbytes-1)))

写一个c语言程序

在Mac系统环境下编写第一个C语言程序,最后把程序运行起来,跟计算机做一个小小的互动 一.编写第一个C语言程序-Hello World 为什么称第一个程序为“Hello Wolrd”呢?其实计算机行业里面,学习任何技术的第一个程序都可以称为“Hello World”.“Hello World”的字面意思是“你好,世界”,也就是跟世界打招呼.我们第一个程序在这世界上诞生了,那肯定要跟世界打声招呼嘛,所以就称为“Hello World”. 1.用什么工具写代码 首先我们要做的肯定是写代码,在代码里面

【转】写一个C语言编译器 : BabyC

[转载]此文是转载,方便以后读与学习. 原文链接:http://blog.jobbole.com/77305/ 动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法. 编译器通常被看作是十分复杂的工程.事实上,编写一个产品级的编译器也确实是一个庞大的任务.但是写一个小巧可用的编译器却不是这么困难. 秘诀就是首先去找到一个最小的可用工程,然后把你想要的特性添加进去.这个方法也是Abdulaziz Ghuloum在他那篇著名的论文“一种构造编译器的捷径”里所提

用汇编语言写的第一个DOS程序

今天整理电脑时,看到两三年前学习汇编语言时写的显示“Hello”的程序.不禁感叹那个时候学得如此用心,同样的功能,我竟然用了四种写法.现贴出源码,为了以后继续学习,也为了给初学者一点启发.(删掉注释了,感觉注释老对不齐,影响美观.) 程序使用MASM5.0编译(谁让书上用的那么古老……) 第一种: ASSUME CS:CODE CODE SEGMENT DB 'HELLO','$' START: MOV AX,CODE MOV DS,AX MOV DX,00H MOV AH,09H INT 21

自己写一个 C 语言 编译器 InnerC

InnerC  用于 ILBC,   我现在把它独立一个版本出来,   项目地址: https://github.com/kelin-xycs/InnerC              , InnerC 是一个   C 语言 编译器,  最初的 目的 是 作为  ILBC  的  中间语言 编译器  用于编译 C 中间语言  . 有关 ILBC ,   见 <ILBC 规范>   https://www.cnblogs.com/KSongKing/p/10354824.html        .

相比于汇编语言的准确性c语言延时精确度如何提升

只要合理的运用,C还是可以达到意想不到的效果.很多朋友抱怨C效率比汇编差了很多,其实如果对Keil C的编译原理有一个较深入的理解,是可以通过恰当的语法运用,让生成的C代码达到最优化.即使这看起来不大可能,但还是有一些简单的原则可循的:1.尽量使用unsigned 型的数据结构.2.尽量使用char型,实在不够用再用int,然后才是long.3.如果有可能,不要用浮点型.4.使用简洁的代码,因为按照经验,简洁的C代码往往可以生成简洁的目标代码(虽说不是在所有的情况下都成立). void dela