ورود

View Full Version : دستوری جایگزین پرش در اسمبلی



esibarnamenevis
شنبه 23 دی 1391, 17:12 عصر
باسلام
دستوری میخوام برای جایگزین دستورات پرش (...jmp ,j**,j)در اسمبلی که بشه ازش استفاده کرده(حالا به هر دلیلی از قبیل محدوده پرش و تعداد گام یا....)
دوستان هر نظری دارند بدند
با تشکر

mazaher5723
شنبه 23 دی 1391, 17:16 عصر
منظورتونو متووجه نشدم خوب از jmp استفاده کن

esibarnamenevis
شنبه 23 دی 1391, 18:35 عصر
منظورتونو متووجه نشدم خوب از jmp استفاده کن
کلا :دستوری میخوام برای جایگزین دستورات پرش در اسمبلی
اصلا میشه واگه هست چطوریه ؟

mazaher5723
شنبه 23 دی 1391, 19:14 عصر
ببین دوست عزیز دستور پرش بدون شرط در اسمبلی از

Jmp Next:


next:

esibarnamenevis
شنبه 23 دی 1391, 19:27 عصر
ببین دوست عزیز دستور پرش بدون شرط در اسمبلی از

Jmp Next:


next:
زحمت کشیدی اینو که همه میدونند
میگم دستور جایگزین یا الگوریتم یا ترفند دیگه وجود داره یا نه؟ همین، سوال سختیه؟؟؟؟

the king
شنبه 23 دی 1391, 21:34 عصر
باسلام
دستوری میخوام برای جایگزین دستورات پرش (...jmp ,j**,j)در اسمبلی که بشه ازش استفاده کرده(حالا به هر دلیلی از قبیل محدوده پرش و تعداد گام یا....)
دوستان هر نظری دارند بدند
با تشکر

در بدترین شرایط از JMP FAR استفاده کنید، یعنی پرش بلند که محدودیت سگمنت نداره.

Delphi Coder
شنبه 23 دی 1391, 23:41 عصر
احتمالا شما مشکلت اینه که جایی که میخوای از jump شرطی استفاده کنی خارج از محدودس میتونی همچین حرکتی بزنی:
مثلا در کد زیر

cmp ax,bx
je mylabel

فکر میکنیم mylabel خارج از محدوده هست. کد رو به شکل زیر مینویسیم:

cmp ax,bx
jne continue
jmp mylabel
continue:
.
.
.

JMP معمولی 3 جوره و کم نمیاره از این لحاظ یکی short jump هست با کد 0EBh که جلوش یک بایت میگیره یکی near jump هست با کد 0E9h که جلوش 2 بایت به عنوان آدرس میگیره یکی هم far jump هست که کلا نسبی نیست و جلوش 4 بایت میگیره که 2 بایت اول افست و 2 بایت بعدی سگمنتی هست.

esibarnamenevis
یک شنبه 24 دی 1391, 01:49 صبح
احتمالا شما مشکلت اینه که جایی که میخوای از jump شرطی استفاده کنی خارج از محدودس میتونی همچین حرکتی بزنی:
مثلا در کد زیر

cmp ax,bx
je mylabel

فکر میکنیم mylabel خارج از محدوده هست. کد رو به شکل زیر مینویسیم:

cmp ax,bx
jne continue
jmp mylabel
continue:
.
.
.

JMP معمولی 3 جوره و کم نمیاره از این لحاظ یکی short jump هست با کد 0EBh که جلوش یک بایت میگیره یکی near jump هست با کد 0E9h که جلوش 2 بایت به عنوان آدرس میگیره یکی هم far jump هست که کلا نسبی نیست و جلوش 4 بایت میگیره که 2 بایت اول افست و 2 بایت بعدی سگمنتی هست.

با تشکر از توضیحات خوبتون
1-فکر کنم باید از jmp far استفاده کنم میشه در مورد نحوه استفادش یه کم بیشتر توضیح بدید (اگه میشه با یه مثال کوچیک )؟
2-اگه دو تا برنامه داشته باشیم و بخوایم از برنامه اول به یک زیر برنامه دیگه که داخل فایل دوم (برنامه دوم) است باید چطور پرش کنم؟

Delphi Coder
یک شنبه 24 دی 1391, 16:02 عصر
خیلی راحت

JMP sg:ofs
این شکل کلی دستور هست که در اون sg نشان دهنده سگمنت و ofs نشان دهنده افست برای دستور jmp هست. فقط احتمال داره بعضی اسمبلرها مثلا تو فایل com که مدل tiny داره ایراد بگیرن به این دستور در این صورت میتونید از opcode اون به شکل زیر استفاده کنید.

db $EA ;Jump far instruction
ofs dw ?
sg dw ?
دو تا برنامه به اون شکلی که شما میگید فقط در حالتی هست که یکی از برنامه ها رزیدنت باشه. برنامه رزیدنت طبیعتا یک وقفه رو hook کرده میتونید در handler وقفه ای که نوشتید چند تا سرویس بزارید مثلا زمانی یه رجیستر مقدار خاصی داره سرویس خاصی رو بهش ارائه بدین. بعد از برنامه خودتون سرویس رو فراخوانی کنید.

esibarnamenevis
یک شنبه 24 دی 1391, 23:34 عصر
دو تا برنامه به اون شکلی که شما میگید فقط در حالتی هست که یکی از برنامه ها رزیدنت باشه. برنامه رزیدنت طبیعتا یک وقفه رو hook کرده میتونید در handler وقفه ای که نوشتید چند تا سرویس بزارید مثلا زمانی یه رجیستر مقدار خاصی داره سرویس خاصی رو بهش ارائه بدین. بعد از برنامه خودتون سرویس رو فراخوانی کنید.
با سلام
بنده هم دقیقا چیزی که گفتید رو انجام داده بودم یعنی یه برنامه مقیم(رزیدنت) کردم بعد یه وقفه (در مثال بالا وقفه شماره 5) رو بازنویسی کردم(تا اینجا مشکلی ندارم ) بعد موقع فراخوانی دقیقا دستورات زیر رو اجرا میکنم که خطایnear jmp or call to different cs رو میده.
حالا با توضیحاتی که دادم خطای مذکور رو میده باید برای رفع این خطا چه کار کنم.
کد برنامه اول(برای فراخوانی برنامه رزیدنت شده):


; multi-segment executable file template.

data segment
; add your data here!
pkey db "press any key...$"
ends

code segment
start:
; set segment registers:
mov ax, data
mov ds, ax
mov es, ax

mov ah,10h
int 16h
cmp ah,97; <a> ?
jne e1

int 5
e1:
mov ax, 4c00h ; exit to operating system.
int 21h
ends

end start ; set entry point and stop the assembler.




حال چند مطلب رو متوجه نشدم(اگه امکانش هست بیشتر و با مثال توضیح بدید ممنون میشم)
1-


handler
منظورتون از handler دقیق چیه؟
2-


چند تا سرویس بزارید مثلا زمانی یه رجیستر مقدار خاصی داره سرویس خاصی رو بهش ارائه بدین. بعد از برنامه خودتون سرویس رو فراخوانی کنید.
میشه توضیح بدید چطوری و با چه سرویسی (اگه امکانش هست با مثال)



با تشکر

esibarnamenevis
سه شنبه 26 دی 1391, 13:16 عصر
دوستان اگه کسی تونست جواب بده(به پست بالا) و راهنمایی کنه....

Delphi Coder
سه شنبه 26 دی 1391, 22:36 عصر
اول اینکه رشته ای که تعریف شده باید بین این ' علامت یا این " علامت باشه. دوم اینکه start اگر label هست باید بعدش : داشته باشه همینطور e1. اما error مربوط میشه به این که شما سگمنتها رو تعریف کردید ولی به اسمبلر نگفتید کدوم سگمنت رو چی در نظر بگیره. این خط رو اضافه کنید به برنامه:

assume cs:code, ds: data
و اما در مورد سرویس. شما وقتی برنامه ای رو رزیدنت میکنید حتما یک کارگردان وقفه(interrupt handler) نوشتید برای وقفه ای که رزیدنت میکنید. حالا سوای اینکه شماره وقفه چی باشه شما میتونید برای خودتون سرویس تعریف کنید مثل وقفه DOS که این همه سرویس داره که شماره سرویس رو با ah میشناسه. حالا شما میای توی کارکردان وقفه ای که نوشتی یه سری سرویس برا خودت تعریف میکنی مثلا فرض کنیم کارگردان وقفه یه چیزی شبیه زیر باشه:

MyInterruptHandler:
cmp ax,9797h
jne Exit
cmp bx,1
jne cnt1
call service1
cnt1:
cmp bx,2
jne cnt2
call service2
cnt2:
.
.
.


حالا service1 یه کار میکنه service2 یه کار دیگه و ....
برای فراخونی هم میای همچین کاری میکنی:

mov ax,9797h
mov bx,1
int 5
این کد مثلا سرویس شماره 1 از برنامه رزیدنت رو فراخوانی میکنه.