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
其实这样感觉非常的邪恶,而且明显不应该这样

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;
}
给大家科普 x86 实模式(其实我也没怎么看)

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.