PDA

View Full Version : خطای near jmp or call to different cs



esibarnamenevis
جمعه 22 دی 1391, 17:06 عصر
باسلام

برنامه ای نوشتم که در حافظه مقیم شده
بعد می خوام با بازنویسی یک وقفه اونو توی هر برنامه ای که بخوام اجرا کنم
وقفه موردنظر رو هم بازنویسی کردم

حالا سوال (مشکل) بنده:
1-داخل برنامه دیگه ای(برنامه زیر) که میخوام با اون وقفه ای که بازنویسی کردم برنامه مقیم شده رو اجرا کنم (مثلا با فشردن دکمه a وقفه رو صدا بزنم)
اینم کد برنامه



; 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.



که پیغام خطای near jmp or call to different cs رو میده که خطا از دستور jmp هستش
به نظرتون مشکل از کجاست ؟ راه حل چیه؟؟؟
در ضمن با tasm تست و اجرا کردم
با تشکر

the king
شنبه 23 دی 1391, 05:18 صبح
باسلام

برنامه ای نوشتم که در حافظه مقیم شده
بعد می خوام با بازنویسی یک وقفه اونو توی هر برنامه ای که بخوام اجرا کنم
وقفه موردنظر رو هم بازنویسی کردم

حالا سوال (مشکل) بنده:
1-داخل برنامه دیگه ای(برنامه زیر) که میخوام با اون وقفه ای که بازنویسی کردم برنامه مقیم شده رو اجرا کنم (مثلا با فشردن دکمه a وقفه رو صدا بزنم)
اینم کد برنامه



; 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.



که پیغام خطای near jmp or call to different cs رو میده که خطا از دستور jmp هستش
به نظرتون مشکل از کجاست ؟ راه حل چیه؟؟؟
در ضمن با tasm تست و اجرا کردم
با تشکر

با TASM 5 مشکلی نداره :


.MODEL SMALL
.DATA
; add your data here!
pkey db "press any key...$"
.CODE
; set segment registers:
.STARTUP

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

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

esibarnamenevis
شنبه 23 دی 1391, 19:29 عصر
کسی نمیدنه این خطا به خاطر چیه؟؟؟؟؟؟؟؟؟؟؟

the king
شنبه 23 دی 1391, 21:27 عصر
کسی نمیدنه این خطا به خاطر چیه؟؟؟؟؟؟؟؟؟؟؟

پیغام خطا مشخصه اما در کد شما نباید همچین موردی باشه، پرش در کد می تونه پرش کوتاه یا پرش بلند باشه،
پرش بلند می تونه به خارج از Segment فعلی کد پرش کنه اما پرش کوتاه مجاز به اینکار نیست. اگر در جایی
از کد پرشی انجام بشه که آدرس مقصد خارج از سگمنت فعلی کد باشه، حتما باید پرش بلند باشه،
وگرنه با همون خطا روبرو میشه.
تو کدی که شما نشون دادید یک پرش بیشتر نیست که اونم چند بایت پایین تر از موقعیت فعلی یه و در همون سگمنت.
این کد مورد اون خطا رو نداره.

esibarnamenevis
یک شنبه 24 دی 1391, 01:53 صبح
پیغام خطا مشخصه اما در کد شما نباید همچین موردی باشه، پرش در کد می تونه پرش کوتاه یا پرش بلند باشه،
پرش بلند می تونه به خارج از Segment فعلی کد پرش کنه اما پرش کوتاه مجاز به اینکار نیست. اگر در جایی
از کد پرشی انجام بشه که آدرس مقصد خارج از سگمنت فعلی کد باشه، حتما باید پرش بلند باشه،
وگرنه با همون خطا روبرو میشه.
تو کدی که شما نشون دادید یک پرش بیشتر نیست که اونم چند بایت پایین تر از موقعیت فعلی یه و در همون سگمنت.
این کد مورد اون خطا رو نداره.

آره دوست عزیز بنده وقفه 5 رو بازنویسی کردم به خاطر همینه که پیغام خطا میده(توی سگمنت دیگه)

میشه در مورد پرش بلند توضیح بیشتر بدید؟و نحوه استفادش؟
با تشکر

esibarnamenevis
سه شنبه 26 دی 1391, 11:32 صبح
دوستان اگه کسی تونست جواب بده و راهنمایی کنه....