duangsuse::Echo
718 subscribers
4.26K photos
130 videos
583 files
6.48K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
This media is not supported in your browser
VIEW IN TELEGRAM
其实这样感觉非常的邪恶,而且明显不应该这样

c3 是我修改字符串指针后被增加的,减小指针使最后一个 ret 指令变成了字符串序列的一部分呢,这是很不好的做法

之前据测试,如果不这样便会导致 CPU 执行到 ret 指令时不会正常返回,而本应该返回到 _start 的,却继续往下解码执行不是机器代码的字符串数据,这实在是太邪恶了
目前仍然不知道为何执行 ret 时没有正常重置 PC,以及为何将 write(fd, data, len) 调用的 buffer 指针参数往前调一位就可以正常执行,但是感觉这不太妙,如果有大佬的话也欢迎来尝试一下
This media is not supported in your browser
VIEW IN TELEGRAM
re2c 是 C 程序员有时可能用到的分词工具,估计是由于某些词法定义类似正则表达式起名叫 re2c
Forwarded from 天天向上 (Basic I/O Interface)
The latest version of re2c (1.1) was released.
类似的 lex / yacc like 工具链有 Lex /Flex 和 Yacc / Bison
此外还有 Parser combinator,但是我完全不了解,两个概念不能混为一谈
抱歉有一点杂事,所以现在才回来,这个... 由于我不清楚 QQQ 的具体循环分支语义,所以某些东西肯定有差异,暂时不写这个了,欢迎 dalao 参观吐槽
一共 132 行未压行的 C99 代码

Makefile 一行:

qqq:
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;
}
This media is not supported in your browser
VIEW IN TELEGRAM
Forwarded from METO 的涂鸦板
🚀Babel 7 发布了,新版正式支持转译 TypeScript.
「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对齐即可)。
Forwarded from LWL 的基地台
ACM:喵喵喵?
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;
}