ورود

View Full Version : call by reference



p3m4ni
چهارشنبه 20 شهریور 1392, 11:20 صبح
سلام
call by reference رو چه جوری انجام میدن مخصوصا وقتی که تابع مورد نظر تو فایل اسمبلی باشه و از vc++ اونو صدا میکنیم.

fjm11100
چهارشنبه 20 شهریور 1392, 12:18 عصر
پوینتر متغیر را بده بهش به همین سادگی!

p3m4ni
چهارشنبه 20 شهریور 1392, 13:29 عصر
این کدهامه:
vC++‎‎:
#include "stdafx.h"
#include <afx.h>
extern "C" UINT32 __stdcall shift (byte *,byte *,byte *,byte *);
byte a1=0x1,a2=0x2,a3=0x3,a4=0x4;
int main(int argc, _TCHAR* argv[])
{
shift(&a1,&a2,&a3,&a4);
printf_s("%x'%x'%x'%x\n\r",a1,a2,a3,a4);
getchar();
return 0;
}


assembly:

;============================================
; shift.asm file
;============================================
.486
.model flat, stdcall
option casemap :none
.code
;--------------------------------------------
shift PROC, Arg1:BYTE, Arg2:BYTE, Arg3:BYTE ,Arg4:BYTE
rcl Arg1,1
rcl Arg2,1
rcl Arg3,1
rcl Arg4,1
ret
shift ENDP
;----------------------------------------------
END
;----------------------------------------------


ولی باز متغییر ها مقدار های اولیشونو دارن
:ناراحت:

p3m4ni
چهارشنبه 20 شهریور 1392, 21:01 عصر
این جوری هم نشد:

extern "C" UINT32 __stdcall shift (byte& arg1,byte& arg2,byte& arg3,byte& arg4);
byte a1=0x1,a2=0x2,a3=0x3,a4=0x4;
int main(int argc, _TCHAR* argv[])
{
shift(a1,a2,a3,a4);
printf_s("%x'%x'%x'%x\n\r",a1,a2,a3,a4);
getchar();
return 0;
}

fjm11100
پنج شنبه 21 شهریور 1392, 00:37 صبح
دومی که معلومه نمیشه
اما برای کد اولت چون شما مقدار عددی آدرس را داری rotate می کنی نه مقدار موجود در اون آدرس را، ضمنا آدرس را با متغیر یک بایتی نمیتونی نگه داری. باید آدرس را به یک رجیستر ایندکسی مثل SI بدی و بعد مقدار آن آدرس را عوض کنی. کد زیر را ببین. البته این برای حالت 16 بیتی است
mov si, arg1
mov al, new_val
mov [si], al

p3m4ni
پنج شنبه 21 شهریور 1392, 13:07 عصر
ممنون دوست من...اینم کاملش:

;============================================
; shift.asm file
;============================================
.486
.model flat, stdcall
option casemap :none
.code
;--------------------------------------------
shift PROC, Arg1:DWORD, Arg2:DWORD, Arg3:DWORD ,Arg4:DWORD,Arg5:DWORD

mov esi,Arg1
mov eax,Arg1
mov eax,[eax]
rcl al,1
mov [esi],al


mov esi,Arg2
mov eax,Arg2
mov eax,[eax]
rcl al,1
mov [esi],al


mov esi,Arg3
mov eax,Arg3
mov eax,[eax]
rcl al,1
mov [esi],al


mov esi,Arg4
mov eax,Arg4
mov eax,[eax]
rcl al,1
mov [esi],al

mov esi,Arg5
mov eax,Arg5
mov eax,[eax]
rcl al,1
mov [esi],al




ret
shift ENDP
;----------------------------------------------
END
;----------------------------------------------