Использование процедур сборки с C на DOS - PullRequest
2 голосов
/ 03 октября 2010

Я некоторое время играл с DOS-сборкой в ​​реальном режиме, и теперь я хочу использовать некоторые подпрограммы в программе на Си. Я использую Turbo C 2.01 и TASM 3.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 голосов
/ 03 октября 2010

Ваш текущий код перезаписывает переданный указатель. Вам нужно получить указатель и написать через него. Примерно так:

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

Сначала напишите этот код на C и посмотрите код ассемблера, который он генерирует, чтобы получить это право.

1 голос
/ 03 октября 2010

Попробуйте заменить:

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
0 голосов
/ 03 октября 2010

Это:

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
0 голосов
/ 03 октября 2010

Я не знаю ассемблера ... но C передает все по значению.

In sum [bp + 4] равно 42 (или 19);в addsetval [bp + 4] равно 0xDEADBEEF 0xDECAFBAD (или как угодно)

...