Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用翻译成ARM指令的C语言在窗口中绘制形状_C_Gcc_Arm_Drawing_Qemu - Fatal编程技术网

使用翻译成ARM指令的C语言在窗口中绘制形状

使用翻译成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

我目前正在尝试学习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/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指令”所做的那样。