私はしばらくDOSリアルモードアセンブリで遊んでいましたが、今はCプログラムでいくつかのルーチンを利用したいと思っています。TurboC2.01とTASM3.0を使用しています。ただし、アドレスによって渡された変数を変更することはできません。以下の_setvalルーチンを参照してください。インラインアセンブリは必要ありません。簡単な例:
foo.c
#include <stdio.h>
extern void setval(int *x, int *y);
extern int sum(int x, int y);
int main()
{
int result, a, b;
result = a = b = 0;
setval(&a, &b);
result = a + b;
printf("a+b=%i, a=%i, b=%i\n", result, a, b);
result = 0;
a = 42;
b = 19;
result = sum(a, b);
printf("a+b=%i, a=%i, b=%i\n", result, a, b);
return 0;
}
foortn.asm
public _setval
public _sum
.model small
.stack
.data
.code
_setval proc near
push bp
mov bp, sp
mov word ptr [bp+4], 42
mov word ptr [bp+6], 19
pop bp
ret
endp
_sum proc near
push bp
mov bp, sp
mov ax, word ptr [bp+4]
add ax, word ptr [bp+6]
pop bp
ret
endp
end
私はそれを次のようにコンパイルします:
tcc -c -ms foo.c
tasm /ml foortn.asm
tcc foo.obj foortn.obj
結果は次のとおりです。
a+b=0, a=0, b=0
a+b=61, a=42, b=19
私は明らかに何かが欠けていますが、何ですか?
ハンス、マーク、ビル、迅速で有益な回答をありがとうございました。