「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)
duangsuse::Echo
#recommended #PL 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…
详细介绍一下这个简单的 OO 系统(虽然算是一个小 trick):
% 上面的代码类似于以下 ES6 代码,如果看不懂 Lisp 系的话(已经中文化)
% 上面的代码类似于以下 ES6 代码,如果看不懂 Lisp 系的话(已经中文化)
class 帐号 {
constructor(初始余额) {
this.余额 = 初始余额
}
收入(钱数) {
// 收入到余额
}
支出(钱数) {
// 检查并支出钱数
}
}
或者,直接的 ES6 翻译版本function 创建帐号(初始余额) {
var 余额 = 初始余额;
return (方法名) => {
let 支出 = function(数额) {
if (余额 >= 数额) {
余额 = 余额 - 数额;
} else {
throw new Error(`钱不够:缺少余额 ${数额 - 余额} 元`);
}
};
let 收入 = function(数额) {
余额 += 数额;
}
switch (方法名) {
case '支出':
return 支出;
case '收入':
return 收入;
default:
throw new Error(`找不到方法 ${方法名}`);
}
};
}
duangsuse::Echo
详细介绍一下这个简单的 OO 系统(虽然算是一个小 trick): % 上面的代码类似于以下 ES6 代码,如果看不懂 Lisp 系的话(已经中文化) class 帐号 { constructor(初始余额) { this.余额 = 初始余额 } 收入(钱数) { // 收入到余额 } 支出(钱数) { // 检查并支出钱数 } } 或者,直接的 ES6 翻译版本 function 创建帐号(初始余额) { var 余额 = 初始余额; …
> 创建帐号
[Function: 创建帐号]
> duangsuse的钱包 = 创建帐号(0.5)
[Function]
> duangsuse的钱包('支出')(0.5) // 买包辣条
undefined
> duangsuse的钱包('支出')(0.5) // 还想买包辣条
Error: 钱不够:缺少余额 0.5 元
at 支出 (repl:9:15)
> duangsuse的钱包('收入')(1) // 众筹了 1 块钱
undefined
> duangsuse的钱包('支出')(0.5) // 再买包辣条
undefined
> duangsuse的钱包('查看')() // 妄图查看钱包
Error: 找不到方法 查看
at repl:23:15
裆燃,ES6 是 OOP 所以可以更符合 OO 一些,不过这里只是示范