我已经玩了一段时间的DOS实模式程序集,现在我想在C程序中使用一些例程。我正在使用Turbo C 2.01和TASM 3.0。但是我无法修改地址传递的变量,请参阅下面的_setval例程。我不需要/想要内联汇编。一个简单的例子:
#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;
}
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
我显然错过了什么,但是什么?
汉斯,马克和比尔,非常感谢你的迅速和有益的回应。
答案 0 :(得分:4)
您当前的代码正在覆盖传递的指针。您需要检索指针并通过它进行写入。像这样:
mov ax, word ptr [bp+4]
mov word ptr [ax], 42
首先在C中编写此代码,然后查看它生成的汇编代码以使其正确。
答案 1 :(得分: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
答案 2 :(得分: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
答案 3 :(得分:-1)
我不知道汇编程序......但C
按值传递所有内容。
在sum
[bp + 4]中是42(或19); in add
setval
[bp + 4]是 0xDEADBEEF 0xDECAFBAD(或其他)