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.另外通知一下呢,duangsuse 不是 Mozilla 员工或者后端大佬。duangsuse 是某种程度上的菜鸡,如果发了看不懂或者不感兴趣... 请允许 duangsuse 继续发 🙈
虽然看来呢,Telegram 上比 duangsuse 在某些程度上不会搞事的人有一点点,但是,duangsuse 知道真正的世界 Telegram 只有一小部分,所以红黑树和 combinator 都不懂的 duangsuse 无法是 dalao(
虽然看来呢,Telegram 上比 duangsuse 在某些程度上不会搞事的人有一点点,但是,duangsuse 知道真正的世界 Telegram 只有一小部分,所以红黑树和 combinator 都不懂的 duangsuse 无法是 dalao(
duangsuse::Echo pinned «另外通知一下呢,duangsuse 不是 Mozilla 员工或者后端大佬。duangsuse 是某种程度上的菜鸡,如果发了看不懂或者不感兴趣... 请允许 duangsuse 继续发 🙈 虽然看来呢,Telegram 上比 duangsuse 在某些程度上不会搞事的人有一点点,但是,duangsuse 知道真正的世界 Telegram 只有一小部分,所以红黑树和 combinator 都不懂的 duangsuse 无法是 dalao(»
#recommended #PL
https://www.binwang.me/2012-01-27-sicp30.html
https://www.binwang.me/2012-01-27-sicp30.html
(define (make-account balance)
(define (withdraw amount)
(if (>= balance amount)
(begin (set! balance (- balance amount))
balance)
"Insufficient funds"))
(define (deposit amount)
(set! balance (+ balance amount))
balance)
(define (dispatch m)
(cond ((eq? m 'withdraw) withdraw)
((eq? m 'deposit) deposit)
(else (error "Unknown request -- MAKE-ACCOUNT"
m))))
dispatch)
(define A1 (make-account 100))
((A1 'dispath) 100)