其实这样感觉非常的邪恶,而且明显不应该这样
之前据测试,如果不这样便会导致 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;
}