ايران ويج

نسخه‌ی کامل: خروجي تابع
شما در حال مشاهده‌ی نسخه‌ی متنی این صفحه می‌باشید. مشاهده‌ی نسخه‌ی کامل با قالب بندی مناسب.
سلام
خسته نباشيد
يه سوال در مورد اسمبلي داشتم. مي خواستم ببينم چه جوري مي شه خروجي يه تابع رو تشخيص داد. مي خوام تابع MessageBoxA‌رو صدا بزنم بعد ببينم مقدار خروجيش چنده ؟ مثلا yes يا no زده و ...


ممنون ميشم كمك كنيد .
خدانگهدار
فکر نمی کنم تو اسمبلی، تابع خروجی داشته باشه!!
متغیرها هم که تو اسمبلی بصورت گلوبال تعریف می شن. پس کافیه یه متغیر رو به عنوان خروجی فرض کنی و اونو مقدار بدی.
سلام
خوب هستيد
تيو اسمبلي معمولا خروجي ها در eax برگردونده ميشه
و يا در edx:ecx برگردونده ميشه
به اميد ديدار
(۰۶-آذر-۱۳۸۸, ۰۱:۳۸:۴۵)saeedsmk نوشته است: [ -> ]سلام
خوب هستيد
تيو اسمبلي معمولا خروجي ها در eax برگردونده ميشه
و يا در edx:ecx برگردونده ميشه
به اميد ديدار

سلام
ميشه يه مثال بزنيد . من كه هر كاري كردم نشد !!!

ممنون
اسمبلی که تو دانشگاه درس می دن معمولا 8086/85 و eax نداره!!

فکر می کنم منظورشون همون بود که من گفتم. نتیجه رو تو یه متغیر یا ثبات(مثل Ax یا EAX ) بذار...
(۰۶-آذر-۱۳۸۸, ۱۹:۵۷:۵۱)Sp!d3rm4n نوشته است: [ -> ]اسمبلی که تو دانشگاه درس می دن معمولا 8086/85 و eax نداره!!

فکر می کنم منظورشون همون بود که من گفتم. نتیجه رو تو یه متغیر یا ثبات(مثل Ax یا EAX ) بذار...

سلام
اگر ميشه يه مثال بزنيد يه سورس كد بديد من متوجه بشم !!

ممنون
چیزی نداره که مثال بزنم!
کد:
.MODEL SMALL
.STACK
.CODE
MAIN PROC FAR
    
    ;INITIALIZE BL
    CALL ADD1
    ;PRINT AL
    .EXIT
MAIN ENDP

ADD1 PROC NEAR
    INC BL
    MOV AL, BL    ;RETURN TO AL
    RET
CAL ENDP

END MAIN

تابع add1 به bl یمی اضاقه می کنه و کپی می کنه تو al
سلام
خوب هستيد
وقتي تابعي مثل MessageBoxA صدا زده بشه يعني اسمبلي تحت ويندوز است . يعني برنامه نويسي 32 بيتي پس خروجي توي ثبات هاي Eax و... برگردانده ميشه .
کد:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib kernel32.lib
include \masm32\include\user32.inc
includelib user32.lib

.data
MsgCaption db "Shadow's Messagebox test",0
MsgBoxText db " [Select OK or Cancle] !",0
MsgBoxTex2 db "You Press OK!",0

.code
start:

invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, 1

.IF eax==1


invoke MessageBox, NULL,addr MsgBoxTex2, addr MsgCaption, 0

.ENDIF

invoke ExitProcess,NULL ; if the user closes our window
end start
كه ديباگش توي اولي ديباگر ميشه
کد:
00401000 ms> $ 6A 01 PUSH 1 ; /Style = MB_OKCANCEL|MB_APPLMODAL
00401002 . 68 00304000 PUSH 403000 ; |Title = "Shadow's Messagebox test"
00401007 . 68 19304000 PUSH 403019 ; |Text = " [Select OK or Cancle] !"
0040100C . 6A 00 PUSH 0 ; |hOwner = NULL
0040100E . E8 25000000 CALL 00401038 ; \MessageBoxA
00401013 . 83F8 01 CMP EAX, 1
00401016 . 75 13 JNZ SHORT 0040102B ; msgbox2.0040102B
00401018 . 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
0040101A . 68 00304000 PUSH 403000 ; |Title = "Shadow's Messagebox test"
0040101F . 68 32304000 PUSH 403032 ; |Text = "You Press OK!"
00401024 . 6A 00 PUSH 0 ; |hOwner = NULL
00401026 . E8 0D000000 CALL 00401038 ; \MessageBoxA
0040102B > 6A 00 PUSH 0 ; /ExitCode = 0
0040102D . E8 00000000 CALL 00401032 ; \ExitProcess
00401032 $- FF25 00204000 JMP NEAR DWORD PTR DS:[402000] ; kernel32.ExitProcess
00401038 $- FF25 08204000 JMP NEAR DWORD PTR DS:[402008] ; USER32.MessageBoxA
به اميد ديدار
(۰۶-آذر-۱۳۸۸, ۲۲:۵۹:۵۰)Sp!d3rm4n نوشته است: [ -> ]چیزی نداره که مثال بزنم!
کد:
.MODEL SMALL
.STACK
.CODE
MAIN PROC FAR



;INITIALIZE BL

CALL ADD1

;PRINT AL

.EXIT
MAIN ENDP

ADD1 PROC NEAR

INC BL

MOV AL, BL
;RETURN TO AL

RET
CAL ENDP

END MAIN

تابع add1 به bl یمی اضاقه می کنه و کپی می کنه تو al
سلام
دست شما درد نكنه.
البته منظور من رو شما نفهميديد !!! من مي خوام خروجي تابع MessageBoxA‌رو بررسي كنم نه تابعي كه خودم نوشتم !!! اين تابع MessageBoxA يه سري آرگومان ميگيره با دستور Push بعد Call ميشه . حالا ميخوام ببينم بعد از صدا زدن خروجي چي شده!!! ايا اصلا پيغامي اومده يا جواب كاربر چي بوده ؟؟

آقا سعيد دستشون تو كاره بهتر متوجه ميشن!!! اميدوارم كه جوابم رو بدن.

خدانگهدار
(۰۷-آذر-۱۳۸۸, ۰۰:۴۷:۳۴)saeedsmk نوشته است: [ -> ]سلام
خوب هستيد
وقتي تابعي مثل MessageBoxA صدا زده بشه يعني اسمبلي تحت ويندوز است . يعني برنامه نويسي 32 بيتي پس خروجي توي ثبات هاي Eax و... برگردانده ميشه .
کد:
.386
.model flat, stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib kernel32.lib
include \masm32\include\user32.inc
includelib user32.lib

.data
MsgCaption db "Shadow's Messagebox test",0
MsgBoxText db " [Select OK or Cancle] !",0
MsgBoxTex2 db "You Press OK!",0

.code
start:

invoke MessageBox, NULL,addr MsgBoxText, addr MsgCaption, 1

.IF eax==1


invoke MessageBox, NULL,addr MsgBoxTex2, addr MsgCaption, 0

.ENDIF

invoke ExitProcess,NULL ; if the user closes our window
end start
كه ديباگش توي اولي ديباگر ميشه
کد:
00401000 ms> $ 6A 01 PUSH 1 ; /Style = MB_OKCANCEL|MB_APPLMODAL
00401002 . 68 00304000 PUSH 403000 ; |Title = "Shadow's Messagebox test"
00401007 . 68 19304000 PUSH 403019 ; |Text = " [Select OK or Cancle] !"
0040100C . 6A 00 PUSH 0 ; |hOwner = NULL
0040100E . E8 25000000 CALL 00401038 ; \MessageBoxA
00401013 . 83F8 01 CMP EAX, 1
00401016 . 75 13 JNZ SHORT 0040102B ; msgbox2.0040102B
00401018 . 6A 00 PUSH 0 ; /Style = MB_OK|MB_APPLMODAL
0040101A . 68 00304000 PUSH 403000 ; |Title = "Shadow's Messagebox test"
0040101F . 68 32304000 PUSH 403032 ; |Text = "You Press OK!"
00401024 . 6A 00 PUSH 0 ; |hOwner = NULL
00401026 . E8 0D000000 CALL 00401038 ; \MessageBoxA
0040102B > 6A 00 PUSH 0 ; /ExitCode = 0
0040102D . E8 00000000 CALL 00401032 ; \ExitProcess
00401032 $- FF25 00204000 JMP NEAR DWORD PTR DS:[402000] ; kernel32.ExitProcess
00401038 $- FF25 08204000 JMP NEAR DWORD PTR DS:[402008] ; USER32.MessageBoxA
به اميد ديدار

سلام
دمت گرم داداش . كارت مثل هميشه حرف نداره Shy

ممنون
عجب ! ما هنوز به اینجاهاش نرسیدیم!! Biggrin بحث تابع جلسه پیش شروع شده ...

یه سوالم من بپرسم :

وقفه دریافت ساعت و تاریخ سیستم چیه؟
عجله دارم. باید پروژه رو تموم کنم. خیلی گشتم پیدا نشد. چندتایی پیدا کردم نگفته بود خروجی تابع کجا میره و چجوریه ...
یه سایت یا مرجع کامل می شناسید که همه وقفه های اسمبلی رو داشته باشه؟