使用翻译成ARM指令的C语言在窗口中绘制形状
我目前正在尝试学习C的方法,并使用GCC将C转换为ARM指令。为此,我尝试在窗口上绘制一个简单的形状,但我很难想出如何在不使用像这样的图形包的情况下完成它。以下是我到目前为止设法解决的问题: 我想说,我的make文件是非常不言自明的使用翻译成ARM指令的C语言在窗口中绘制形状,c,gcc,arm,drawing,qemu,C,Gcc,Arm,Drawing,Qemu,我目前正在尝试学习C的方法,并使用GCC将C转换为ARM指令。为此,我尝试在窗口上绘制一个简单的形状,但我很难想出如何在不使用像这样的图形包的情况下完成它。以下是我到目前为止设法解决的问题: 我想说,我的make文件是非常不言自明的 CC=/cygdrive/c/Users/Ribbyon/Desktop/gcc-arm-none-eabi-5_3-2016q1-20160330-win32/bin/arm-none-eabi-gcc LD=/cygdrive/c/Users/Ribbyon/D
CC=/cygdrive/c/Users/Ribbyon/Desktop/gcc-arm-none-eabi-5_3-2016q1-20160330-win32/bin/arm-none-eabi-gcc
LD=/cygdrive/c/Users/Ribbyon/Desktop/gcc-arm-none-eabi-5_3-2016q1-20160330-win32/bin/arm-none-eabi-ld.exe
AS=$(CC)
OBJCOPY=/cygdrive/c/Users/Ribbyon/Desktop/gcc-arm-none-eabi-5_3-2016q1-20160330-win32/bin/arm-none-eabi-objcopy.exe
QEMU=/cygdrive/c/Users/Ribbyon/Desktop/qemu/qemu-system-arm.exe
#these should be cross-platform...
CC+= -Wall -c -mcpu=arm926ej-s -marm -Werror
LD+=-Map kernelmap.txt -T linkerscript.txt
AS+= -c -x assembler-with-cpp -mcpu=arm926ej-s
QEMUARGS=-machine integratorcp -kernel kernel.bin -serial stdio
DISPLAY?=:0
export DISPLAY
SDL_STDIO_REDIRECT=no
export SDL_STDIO_REDIRECT
all:
$(AS) kernelasm.s
$(CC) kernelc.c
$(CC) console.c
$(LD) -o kernel.tmp kernelasm.o kernelc.o console.o
$(OBJCOPY) -Obinary kernel.tmp kernel.bin
$(QEMU) $(QEMUARGS) kernel.bin
clean:
-/bin/rm *.o *.exe *.bin *.img *.tmp
要将其放在一起的Linkerscript:
ENTRY (_start)
SECTIONS {
/* The kernel will be loaded at this address in RAM.
The dot (.) means "the current location" */
. = 0x10000 ;
.text : {
/* stext = start of text (read-only) section */
stext = .;
/* .text = program code. rodata and rdata = read-only data */
*(.text)
*(.rodata)
*(.rdata)
*(.rdata$zzz)
/* etext = end of text section */
etext = .;
/* pad to a 4K boundary */
. = ALIGN( ABSOLUTE(.) , 0x1000 );
/* start of data (writable) section */
_sdata = .;
sdata = .;
*(.data)
_edata = .;
edata = .;
/* end of data section */
/* bss: Block Started by Symbol: Uninitialized data */
_sbss = . ;
sbss = . ;
*(COMMON)
*(.bss)
_ebss = . ;
ebss = . ;
}
/DISCARD/ : {
*(.eh_frame)
*(.comment)
}
}
内核映射(完整性):
内核:
ldr sp,=stack
b kmain
forever:
b forever
.section .data
.global stack
.rept 1024
.word 0
.end
stack:
现在,我知道在C中,我可以做一些类似的事情:
#include<graphics.h>
#include<conio.h>
main()
{
int gd = DETECT, gm;
initgraph(&gd, &gm, "C:\\TC\\BGI");
setcolor(BLUE);
rectangle(50,50,100,100);
getch();
closegraph();
return 0;
}
我正在使用它的内核:
#include "console.h"
void kmain(){
console_init();
//draw using setpixel
while(1){
}
}
我写了它的骨架,但我不知道从这里去哪里。我相信我需要将蓝色从RBG波段中分离出来并显示出来,但是我很难弄清楚如何利用我在C示例中为ARM使用的逻辑
我想我可能需要为矩形的放置定义屏幕的宽度和高度:
#define WIDTH 800
#define HEIGHT 600
以及帧缓冲区,用于在屏幕上放置矩形的位置进行实际通信:
#define framebuffer ((volatile unsigned short*) (((0x07ffffff - WIDTH*HEIGHT*2))&~0xf))
framebuffer[ HEIGHT/2 * WIDTH + WIDTH/2 ] = #0000FF
以及将蓝色分配给屏幕的方法:
#define framebuffer ((volatile unsigned short*) (((0x07ffffff - WIDTH*HEIGHT*2))&~0xf))
framebuffer[ HEIGHT/2 * WIDTH + WIDTH/2 ] = #0000FF
我可以用脚本之类的东西来抓取颜色吗
((b >> 3) | (r << 8) | (g << 3))
((b>>3)|(r我建议不要在关闭优化功能的情况下通过阅读gcc编译器输出来学习asm:gcc以一种非常好的方式完成了它的工作,并且它在asm代码中产生的许多东西对于初学者来说并不明显。首先用C实现所有东西(它允许几乎所有东西都实现),然后在您拥有工作原型后,在asm中重新实现时间关键部分我认为您将“C”与“一个具有IBM PC兼容BIOS和一些特定于实现的头文件和与之交互的库的系统”混淆了…更详细地说,在没有BIOS代码驱动显示控制器并将其抽象到系统调用之后的情况下,这意味着您正在编写自己的显示驱动程序-因为您选择了模拟,这将是为了。也许还值得注意的是,这与“C转换为ARM指令”有着同样多的关系正如您的PC示例中的“C转换为x86指令”一样。我建议不要通过阅读gcc编译器输出来学习asm,即使在关闭优化功能的情况下:gcc以一种非常好的方式完成其工作,并且它在asm代码中产生的许多东西对于初学者来说并不明显。首先用C实现所有东西(它确实允许制造几乎所有的东西),然后在您拥有工作原型后,在asm中重新实现时间关键部分我认为您将“C”与“一个具有IBM PC兼容BIOS的系统以及一些与之交互的特定于实现的头文件和库”混淆了…更详细地说,在没有BIOS代码驱动显示控制器并将其抽象到系统调用之后的情况下,这意味着您正在编写自己的显示驱动程序-因为您选择了模拟,这将是为了。也许还值得注意的是,这与“C转换为ARM指令”有着同样多的关系正如您的PC示例使用“C转换为x86指令”所做的那样。