其实这样感觉非常的邪恶,而且明显不应该这样
之前据测试,如果不这样便会导致 CPU 执行到
目前仍然不知道为何执行
c3 是我修改字符串指针后被增加的,减小指针使最后一个 ret 指令变成了字符串序列的一部分呢,这是很不好的做法之前据测试,如果不这样便会导致 CPU 执行到
ret 指令时不会正常返回,而本应该返回到 _start 的,却继续往下解码执行不是机器代码的字符串数据,这实在是太邪恶了目前仍然不知道为何执行
ret 时没有正常重置 PC,以及为何将 write(fd, data, len) 调用的 buffer 指针参数往前调一位就可以正常执行,但是感觉这不太妙,如果有大佬的话也欢迎来尝试一下Forwarded from 天天向上 (Basic I/O Interface)
The latest version of re2c (1.1) was released.
类似的 lex / yacc like 工具链有 Lex /Flex 和 Yacc / Bison
此外还有 Parser combinator,但是我完全不了解,两个概念不能混为一谈
此外还有 Parser combinator,但是我完全不了解,两个概念不能混为一谈
duangsuse::Echo
qqq.c
另外有一块堆内存我没 free... 要用的时候记得自己 free
free(tqvm->tape_ptr);typedef struct qqqvm_st {
int *tape_ptr;
size_t tape_size;
size_t cell_ptr;
} TQVM;
int main(int argc, char *argv[]) {
TQVM tqvm;
TQVM_InitiateVM(&tqvm);
if (argc > 1)
TQVM_GrowHeap(&tqvm, atoi(argv[1]));
TQVM_Interpret(&tqvm, getchar);
TQVM_DebugBuffer(&tqvm);
printf("\nFinised QQQVM at 0x%x with final heap size %i and cell pointer to %i\n",
&tqvm, tqvm.tape_size, tqvm.cell_ptr);
return tqvm.cell_ptr;
}「CDECL」C 语言标准调用模式(x86 架构中)
+ 函数实参在线程栈上按照从右至左的顺序依次压栈
+ 函数结果保存在寄存器EAX/AX/AL中
+ 浮点型结果存放在寄存器ST0中
+ 编译后的函数名前缀以一个下划线字符
+ 调用者负责从线程栈中弹出实参(即清栈)
+ 8比特或者16比特长的整形实参提升为32比特长。
+ 受到函数调用影响的寄存器(volatile registers):EAX, ECX, EDX, ST0 - ST7, ES, GS
+ 不受函数调用影响的寄存器: EBX, EBP, ESP, EDI, ESI, CS, DS
+ RET指令从函数被调用者返回到调用者(实质上是读取寄存器EBP所指的线程栈之处保存的函数返回地址并加载到IP寄存器)
GCC的函数返回值都是由调用者分配空间,并把该空间的地址作为隐式参数传递给被调函数,而不使用寄存器EAX。GCC自4.5版本开始,调用函数时,堆栈上的数据必须以16B对齐(之前的版本只需要4B对齐即可)。
+ 函数实参在线程栈上按照从右至左的顺序依次压栈
+ 函数结果保存在寄存器EAX/AX/AL中
+ 浮点型结果存放在寄存器ST0中
+ 编译后的函数名前缀以一个下划线字符
+ 调用者负责从线程栈中弹出实参(即清栈)
+ 8比特或者16比特长的整形实参提升为32比特长。
+ 受到函数调用影响的寄存器(volatile registers):EAX, ECX, EDX, ST0 - ST7, ES, GS
+ 不受函数调用影响的寄存器: EBX, EBP, ESP, EDI, ESI, CS, DS
+ RET指令从函数被调用者返回到调用者(实质上是读取寄存器EBP所指的线程栈之处保存的函数返回地址并加载到IP寄存器)
GCC的函数返回值都是由调用者分配空间,并把该空间的地址作为隐式参数传递给被调函数,而不使用寄存器EAX。GCC自4.5版本开始,调用函数时,堆栈上的数据必须以16B对齐(之前的版本只需要4B对齐即可)。
Forwarded from dnaugsuz
#recommended #project
https://zh.wikipedia.org/wiki/%E8%B2%9D%E5%A7%86%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8
Boehm 是很著名的垃圾收集器,支持高级的自动内存管理算法
如果它的体积可以接受,就可以用它
https://zh.wikipedia.org/wiki/%E8%B2%9D%E5%A7%86%E5%9E%83%E5%9C%BE%E6%94%B6%E9%9B%86%E5%99%A8
Boehm 是很著名的垃圾收集器,支持高级的自动内存管理算法
如果它的体积可以接受,就可以用它
Wikipedia
貝姆垃圾收集器
Boehm-Demers-Weiser garbage collector,也就是著名的Boehm GC,是計算機應用在C/C++語言上的一個保守的垃圾回收器,可應用於許多經由C/C++開發的專案,同時也適用於其它執行環境的各類程式語言,包括了GNU版Java編譯器執行環境,以及Mono的Microsoft .NET移植平台。同時支援許多的作業平台,如各種Unix作業系統,微軟的作業系統(Microsoft Windows),以及麥金塔上的作業系統(Mac OS X),還有更進一步的功能,例如:漸進式收集(incremental…
Forwarded from dnaugsuz
#include "gc.h"
#include <assert.h>
#include <stdio.h>
int main()
{
int i;
GC_INIT();
for(i = 0; i < 10000000; I)
{
int **p = (int **) GC_MALLOC(sizeof (int *));
int *q = (int *) GC_MALLOC_ATOMIC(sizeof (int));
assert(*p == 0);
*p = (int *) GC_REALLOC(q, 2 * sizeof (int));
if(i % 100000 == 0)
printf("Heap size = %d\n", GC_get_heap_size());
}
return 0;
}
给大家科普 x86 实模式(其实我也没怎么看)
https://wiki.osdev.org/Real_Mode
https://wiki.osdev.org/Real_Mode
Real Mode is a simplistic 16-bit mode that is present on all x86 processors. Real Mode was the first x86 mode design and was used by many early operating systems before the birth of Protected Mode. For compatibility purposes, all x86 processors begin execution in Real Mode.