View Full Version : مشکل jump در هنگام اسمبل کردن فایل!
zappy137
پنج شنبه 05 دی 1392, 19:37 عصر
سلام
وقتی میخوام از دستور پرش استفاده کنم ارور میده relative jump out of range by 001bh bytes
نمی تونم فاصله شم کمتر کنم. دستور دیگری هست یا چکار کنم بتونه پرش کنه!؟:متفکر:
Delphi Coder
پنج شنبه 05 دی 1392, 23:47 عصر
حداکثر فاصله ای که دستورات jump شرطی میتونن ساپورت کنند 127 بایت هست. کد رو مثل حال زیر تغییر بدید:
JE ItsOK
به شکل زیر میشه تغییر داد
JNE continue
JMP ItsOk
continue:
zappy137
جمعه 06 دی 1392, 01:54 صبح
ممنون از راهنمایی تون ولی من اومدم مقایسه کردم با صفر گفتم اگر برابر بود پرش کنه 20 خط بالاتر که منوی اصلی برنامست. ولی نمی دونم چرا وقتی صفر میدم پرش نمی کنه به خط مورد نظر و خطای زیر رو میده!
---------------------------
16 bit MS-DOS Subsystem
---------------------------
C:\Windows\system32\cmd.exe - 13-3
The NTVDM CPU has encountered an illegal instruction.
CS:0000 IP:0075 OP:f0 00 f0 37 05 Choose 'Close' to terminate the application.
---------------------------
Close Ignore
zappy137
جمعه 06 دی 1392, 01:59 صبح
بخش از برنامم اینه .برنامه اینه که اطلاعات دانشجو ها رو بگیره بریزه تو فایلی. برنامه بصورت منویی هست که میتوان کارهای مختلفی بکنیم . این تیکه از برنامه هم سطر مورد نظر کاربر از فایل که توش اطلاعات دانشجوهاست نشون میده تهش گفتم اگر کاربر صفر وارد کرد برگرده منوی اصلی ولی نمیدونم چرا خطای بالا رو میده!
go_line proc
call cls ;clear screen
go: mov byte ptr rowcol+1, 0 ;row=0
mov byte ptr rowcol, 0 ;col=0
push rowcol
call move_cursor
loop1:
push offset prompt1
call disp_message
push offset buffer
call get_num ;read a number
mov recno, ax ;recno=ax
cmp ax, 0 ;if recno=0 then goto end
je end1
call go_recno1
call read_file ;read a record
mov byte_read, ax ;lenght of read
cmp byte_read, 00
JNe continue
JMP while1
continue:
push offset out_tel_name
call disp_message
jmp go
ret
go_line endp
Delphi Coder
جمعه 06 دی 1392, 02:51 صبح
برنامه رو اصولی ننوشتید. پرش از داخل یک پروسیجر به یه ناحیه خارج از اون ایده خوبی نیست. و اما یک نکته که ممکنه براتون مفید باشه موقعی که پردازشگر به دستور call میرسه آدرس دستور بعدی رو در stack قرار میده و بعد کنترل به ناحیه مورد نظر واگذار میشه و بعد که به دستور ret میرسه اولین مقدار موجود رو از استک برمیداره و به اونجا پرش میکنه. پس اگر چیز اضافه ای در استک باشه کنترل برنامه به جای نامشخصی میره و ....
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.