2

私はしばらく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

私は明らかに何かが欠けていますが、何ですか?

ハンス、マーク、ビル、迅速で有益な回答をありがとうございました。

4

4 に答える 4

4

現在のコードは、渡されたポインタを上書きしています。ポインタを取得して書き込む必要があります。このようなもの:

mov ax, word ptr [bp+4]
mov word ptr [ax], 42

最初にこのコードをCで記述し、これを正しく行うために生成されるアセンブリコードを確認します。

于 2010-10-03T15:48:09.480 に答える
1

交換してみてください:

mov word ptr [bp+4], 42
mov word ptr [bp+6], 19

mov bx, word ptr [bp+4]
mov [bx], 42
mov bx, word ptr [bp+6]
mov [bx], 19
于 2010-10-03T15:44:48.643 に答える
0

これ:

mov word ptr [bp+4], 42
mov word ptr [bp+6], 19

スタック上のアドレスではなく、スタックに書き込んでいます。スタック上のアドレスを読み取り、代わりにそれらに書き込む必要があります。

mov bx,[bp+4]  ; get the address of (a)
mov [bx],42    ; Write to that address
mov bx,[bp+6]  ; (b)
mov [bx],19    ; write
于 2010-10-03T16:05:32.317 に答える
-1

アセンブラはわかりませんが...すべてを値でC渡します。

[bp + 4]ではsum42(または19)です。[bp +4]は0xDEADBEEF0xDECAFBAD またはその他)ですaddsetval

于 2010-10-03T15:29:22.860 に答える