에서 long int를 반환하면 asm proc에서 eax를 통해 long int가 반환되고 나중에 dx : ax를 통해 시도되었습니다. C printf가 필요한 320L과 다른 번호를 인쇄 할 때 둘 다 나를 위해 작동하지 않았습니다.8086/386 asm with bcc5 : asm proc
x.asm :
.model SMALL
.stack 100h
.code
.386
; extern int get_buffered_long(long int **arr, int num_of_elements, int i);
; [BP+4] [BP+6] [BP+8]
PUBLIC _get_bufferred_long
_get_bufferred_long PROC NEAR
push BP
mov BP,SP
push SI
push DI
push BX
call locate_slot
;mov EAX, DWORD PTR [DI] ;something here doesn't work. the way i return a long int to borland C, or other issue.
mov ax,[DI]
mov dx,[DI+2]
pop BX
pop DI
pop SI
pop BP
ret
_get_bufferred_long ENDP
; extern void set_bufferred_long(long int *arr[], int buff_size, int i,long int value);
; [BP+4] [BP+6] [BP+8] [BP+10]
PUBLIC _set_bufferred_long
_set_bufferred_long PROC NEAR
push BP
mov BP,SP
pushad
call locate_slot
mov EAX,[BP+10]
mov DWORD PTR [DI],EAX
popad
pop BP
ret
_set_bufferred_long ENDP
; helper function that makes DI point to the slot wanted.
locate_slot PROC NEAR
calc_slot:
mov SI,[BP+4]
mov AX,[BP+8]
mov BX,[BP+6]
xor DX,DX
div BX
locate_slot_in_array:
shl AX,1
add SI,AX
mov DI,[SI]
shl DX,2
add DI,DX
ret
locate_slot ENDP
end
y.c :
#include "stdio.h"
#include "stdlib.h"
extern int get_bufferred_long(long int**,int,int);
extern void set_bufferred_long(long int**,int,int,long int);
int main(){
long int **arr;
int i,j,n,m;
n = 5;
m = 4;
arr=(long int**)malloc(n*sizeof(long int*));
for(i=0; i < n; i = i + 2) arr[i] = malloc(m*sizeof(long int));
for(i=1; i < n; i = i + 2) arr[i] = malloc(m*sizeof(long int));
for(i=0; i < n; i++)
for(j=0; j < m; j++)
set_bufferred_long(arr, m, i*m+j, i*100+j*10);
printf("get_bufferred_long(arr, %d, %d) = %ld\n", m, 14, get_bufferred_long(arr,m, 14));
return 0;
}
설정 기능 (배열에 필요한 정확히 같은 모양) 작동합니다. get 함수도 작동합니다. asm에서 320L을 가져 오지만, C에 전달되면 뭔가 잘못되었습니다.
컴파일 오류 또는 경고가 없습니다. borland C++ 5.02
아마도 툴 체인을 15 년 전에 출시 된 것보다 조금 더 업그레이드했다고 생각 했습니까? gcc는 비어 있고 음성은 없지만 Visual C++ Express는 최소한 비어 있지 않습니다. 죽은 기술을 개발할 좋은 이유가 있기를 바랍니다. – paxdiablo
@paxdiablo : uni hw, overpowered. – ckid