PDA

View Full Version : سوال: فراخوانی زیربرنامه های far



kazemproger
پنج شنبه 17 دی 1388, 16:59 عصر
با سلام
من می خوام یک زیربرنامه far رو فراخوانی کنم ولی با دستور call نمی تونم این کار رو بکنم خطا می ده. کسی میدونه دستور call رو چطوری باید بنویسم که درست بشه؟:متفکر:

babol-hacker
جمعه 18 دی 1388, 02:41 صبح
با سلام
من می خوام یک زیربرنامه far رو فراخوانی کنم ولی با دستور call نمی تونم این کار رو بکنم خطا می ده. کسی میدونه دستور call رو چطوری باید بنویسم که درست بشه؟:متفکر:
call name
سورستو بذاری کمکمون نتیجه بخش تره

shask00l
جمعه 18 دی 1388, 06:20 صبح
تا جایی که من میدونم توی استاندارد x86 فقط بدنه اصلی برنامه میتونه far باشه و بقیه زیربرنامه ها باید near باشند . :لبخندساده:

tdkhakpur
جمعه 18 دی 1388, 11:20 صبح
اسمبلی هم مانند سایر زبانها احتیاج به قوانینی دارد که باید از انها پیروی کرد وقتی شما پیشفرض برنامه مینویسید توابع بصورد درون سگمنتی یا همان near تعبیه میشوند و وقتی شما برنامه ای می نویسید که باید از پروسه های دور یا FAR حمایت کنند باید قبل از فراخوانی این نوع پروسه ها تعریف و معرفی گردند روش ساده تر آنست که شما پروسه های far را قبل از توابعی قرار بدید که انها را فراخوانی میکنند کد زیر کمک خوبی برای برنامه های شما میتواند باشد .


stacksg segment para stack 'stack'
stacksg ends
datasg segment para 'data'
datasg ends
codes segment para 'code'
;--------------------------------------
proc1 proc far; این تابع بالاتر از توابه فراخوانی کننده تعریف شده است
retf
proc1 endp
;--------------------------------------
main proc far
assume ss:stacksg, ds:datasg, cs:codes
mov ax, datasg
mov ds, ax
;------------ ur programm
call proc1
;------------ end of program
mov ax, 4c00h
int 21h
main endp
codes ends
end main

babol-hacker
جمعه 18 دی 1388, 12:33 عصر
اسمبلی هم مانند سایر زبانها احتیاج به قوانینی دارد که باید از انها پیروی کرد وقتی شما پیشفرض برنامه مینویسید توابع بصورد درون سگمنتی یا همان near تعبیه میشوند و وقتی شما برنامه ای می نویسید که باید از پروسه های دور یا FAR حمایت کنند باید قبل از فراخوانی این نوع پروسه ها تعریف و معرفی گردند روش ساده تر آنست که شما پروسه های far را قبل از توابعی قرار بدید که انها را فراخوانی میکنند کد زیر کمک خوبی برای برنامه های شما میتواند باشد .


stacksg segment para stack 'stack'
stacksg ends
datasg segment para 'data'
datasg ends
codes segment para 'code'
;--------------------------------------
proc1 proc far; این تابع بالاتر از توابه فراخوانی کننده تعریف شده است
retf
proc1 endp
;--------------------------------------
main proc far
assume ss:stacksg, ds:datasg, cs:codes
mov ax, datasg
mov ds, ax
;------------ ur programm
call proc1
;------------ end of program
mov ax, 4c00h
int 21h
main endp
codes ends
end main

من تست کردم اشکال گرفت فکر کنم جز MAIN نمیشه دیگه FAR در نظر گرفت تابعی و

babol-hacker
جمعه 18 دی 1388, 12:35 عصر
از این قالب استفاده کن بدون نوشتن FAR یا NEAR

.MODEL SMALL
.STACK 64
.DATA
MSG1 DB "SALAM$"
MSG2 DB " KHOBI?$"
.CODE
MAIN PROC FAR
MOV AX,@DATA
MOV DS,AX
;---------
CALL SHOW







;----------
MOV AH,00H
INT 16H
;-----------
MOV AX,4C00H
INT 21H
;-------
MAIN ENDP

SHOW PROC
MOV AH,9
LEA DX,MSG1
INT 21H
CALL SHOW2
RET
SHOW ENDP
SHOW2 PROC
MOV AH,09H
LEA DX,MSG2
INT 21H
RET
SHOW2 ENDP
END MAIN

babol-hacker
جمعه 18 دی 1388, 12:39 عصر
آقا اجازه من بلد نیستم ازین CODE BOX ها بزارم تو پست هام چجوریه؟

کد :
اینو میگم

tdkhakpur
جمعه 18 دی 1388, 20:21 عصر
من تست کردم اشکال گرفت فکر کنم جز MAIN نمیشه دیگه FAR در نظر گرفت تابعی و
از چی ایراد گرفت این یه قانون کلی هست که همه جا میشود از آن استفاده کرد و جزو قوانین اسمبلی حساب میشود.

babol-hacker
شنبه 19 دی 1388, 00:05 صبح
جز یک proc که ما میگیم همون main ما نمیشه بقیه far باشند

mehrara_bolouri
سه شنبه 22 دی 1388, 13:04 عصر
salam khoobi? mi2ni komakam koni mashsoom elayhaye marake 1 moshtarake 1 adada ro benevisam???????????? ba asembeli????????????:لبخندساده:

kazemproger
سه شنبه 22 دی 1388, 20:38 عصر
دوستان خیلی ممنون. خودم یه روش پیدا کردم که میشه یه زیربرنامه far رو فراخوانی کرد. تستم کردم درسته. حالا نتایح تحقیقاتم رو براتون می گم شاید به دردتون بخوره :لبخندساده:
اگه بخواین یه برنامه بنویسین که توش یک زیربرنامه از نوع far داشته باشد باید یک segment در ابتدای برنامه تعریف کنین. با استفاده از دستور extern بصورت زیر
EXTRN SUBPROG:FAR
codesg segment para 'code'
main proc far
Assume CS:CODESG, ...
.
.
.
CALL SUBPROG
.
.
.
MOV ax,4c00h
INT 21h
ret
main endp
codesg ends
end main
سگمنتی رو که تعریف کردین از اینجا شروع می کنین به نوشتن. که با دستور
public
شروع میشه:


PUBLIC SUBPROG
SUBSG SEGMENT
SUBPROG PROC FAR
Assume CS:SUBSG,...
.
.
.
دستورات زیربرنامه
.
.
.
RETF
SUBPROG ENDP
SUBSG ENDS
END

mehrara_bolouri
پنج شنبه 24 دی 1388, 18:50 عصر
salam va3 farakhani bayad kare ziro anjam bedi
call far esme zir barname

babol-hacker
پنج شنبه 24 دی 1388, 20:00 عصر
با تشکر از دوست عزیز mehrara_bolouri
تست شد درست بود


.MODEL SMALL
.STACK 64

.DATA
.CODE
MAIN PROC FAR
MOV AX,@DATA
MOV DS,AX
MOV ES,AX
;----------

CALL FAR T

;----------
MOV AX,4C00H
INT 21H

MAIN ENDP
T PROC FAR

T ENDP
END MAIN