C言語でCurrying 3
もっとも簡単な手段がもっとも優れた手段ということがしばしばある。
calleeがスタックを解放する場合
x86=IA32でのstdcall関数の場合、calleeがスタックを解放する。つまり
call cを呼んだ直後のスタック | …… | 100 | ret(c) | |
---|---|---|---|---|
jmp addを呼んだ直後のスタック | …… | 100 | 10 | ret(c) |
で良い。
#include <stdlib.h> #include <stdio.h> extern int __attribute__((stdcall)) add(int i, int j); int __attribute__((stdcall)) add(int i, int j) { return i + j; } extern int __attribute__((stdcall)) add4(int j); __asm__(".global add4\n\t" "add4:\n\t" "popl %eax\n\t" "pushl $4\n\t" "pushl %eax\n\t" "jmp add"); int main() { printf("%d\n", add4(3)); return 0; }
このadd4()はたったの9bytesに収まる。Xbyakを使えば実用に足るような気もしてきた。