PDA

View Full Version : سوال: مشکل در اجرای برنامه نوشته شده ماشین حساب



ahangari365
جمعه 24 تیر 1390, 11:38 صبح
این برنامه هنگام اجرا در Command Prompt با masm تا 21error server میده نمیدونم اشکال کار کجاست اگه کسی میتونه کمکم کنه .در ضمن MAC1.lib , string.lib که موقع اجرا باید باشه ضمیمه این تاپیک شده


include MAC1.lib
include string.lib
datasg segment 'data'
op db 0 ;variant operation
op1 db ?
x dw 0
sum dw 0
m db 0
s db 0
h db 4
a db ?
d db ?
st1 db ?,'$'
stce db 'CE','$'
stsum db 8 dup(?),'$'

stcls db 8 dup(' '),'$'

stcan db 'Cannot Div by Zero.','$'
datasg ends
codesg segment 'code'
main proc far
init1
gotoxy1 4,3
putch1 '0'
fir: wincalc stce
;*********************jmp to part any btn*******************************
cmp m,0
jz lce
cmp m,1
jz num0
cmp m,2
jz ope5 ;ope5 = '='
cmp m,3
jz ope3 ;ope3 = '/'
cmp m,4
jz num1
cmp m,5
jz num2
cmp m,6
jz num3
cmp m,7
jz ope4 ;ope4 = '*'
cmp m,8
jz num4
cmp m,9
jz num5
cmp m,10
jz num6
cmp m,11
jz ope2 ;ope2 = '-'
cmp m,12
jz num7
cmp m,13
jz num8
cmp m,14
jz num9
cmp m,15
jz ope1 ;ope1 = '+'
;****************************************selected btn selects*************************
num0: window1 8,22,11,25,14h ;num0
mov a,0
gotoxy1 9,23
putch1 '0'
jmp endl

num1: window1 3,17,6,20,14h ;num1
mov a,1
gotoxy1 4,18
putch1 '1'
jmp endl
num2: window1 8,17,11,20,14h ;num2
mov a,2
gotoxy1 9,18
putch1 '2'
jmp endl
num3: window1 13,17,16,20,14h ;num3
mov a,3
gotoxy1 14,18
putch1 '3'
jmp endl

num4: window1 3,12,6,15,14h ;num4
mov a,4
gotoxy1 4,13
putch1 '4'
jmp endl
num5: window1 8,12,11,15,14h ;num5
mov a,5
gotoxy1 9,13
putch1 '5'
jmp endl
num6: window1 13,12,16,15,14h ;num6
mov a,6
gotoxy1 14,13
putch1 '6'
jmp endl

num7: window1 3,7,6,10,14h
mov a,7
gotoxy1 4,8
putch1 '7'
jmp endl

num8: window1 8,7,11,10,14h
mov a,8
gotoxy1 9,8
putch1 '8'
jmp endl

num9: window1 13,7,16,10,14h
mov a,9
gotoxy1 14,8
putch1 '9'
jmp endl

ope1: window1 18,7,21,10,14h ;bnt +
gotoxy1 19,8
putch1 '+'
jmp endl
ope2: window1 18,12,21,15,14h ;btn -
gotoxy1 19,13
putch1 '-'
jmp endl
ope3: window1 18,22,21,25,14h ;ope /
gotoxy1 19,23
putch1 '/'
jmp endl
ope4: window1 18,17,21,20,14h ;btn *
gotoxy1 19,18
putch1 '*'
jmp endl
ope5: window1 13,22,16,25,14h ;ope =
gotoxy1 14,23
putch1 '='
jmp endl

lce: window1 3,22,6,25,14h ;btn ce
gotoxy1 4,23
puts1 stce
jmp endl

endl: strcpy stsum
gotoxy1 14,3
itoa1 x,stsum
puts1 stsum
puts1 stcls

;***************************************read any kay******************
lre: mov ah,0h
int 16h ;Read a Char

cmp al,27 ;Press 'ESC'
jz p0
cmp al,13 ;Press 'Enter'
jz lsec
cmp al,0 ;Press 'Arrow'
jz laro
cmp al,0eh
jz laro
jmp lre

;*************************************check for press why key**********************
lsec: cmp m,0
mov op,0 ;op='CE'
jz wop
cmp m,2
mov op,1 ;op='='
jz wop
cmp m,3
mov op,2 ;op='/'
jz wop
cmp m,7
mov op,3 ;op='*'
jz wop
cmp m,11
mov op,4 ;op='-'
jz wop
cmp m,15
mov op,5 ;op='+'
jz wop
jmp wdi

laro: cmp ah,80 ;Press 'Arrow Down'
jz down1
cmp ah,72 ;Press 'Arrow Up'
jz up1
cmp ah,77 ;Press 'Arrow Right'
jz right1
cmp ah,75 ;Press 'Arrow Left'
jz left1

;*************************************arrow******* **************************
down1: cmp m,0
jge down2
jmp down_1
down2: cmp m,3
jg down_1
add m,12
jmp enddown
down_1: sub m,4
enddown:jmp fir

up1: cmp m,12
jge up2
jmp up_1
up2: cmp m,15
jg up_1
sub m,12
jmp enddown
up_1: add m,4
endup:jmp fir

right1: cmp m,15
jnz right2
mov m,0
jmp endright
right2: inc m
jmp endright
right_1:sub m,4
endright:jmp fir

left1: cmp m,0
jnz left2
mov m,15
jmp endleft
left2: dec m
jmp endleft
left_1:sub m,4
endleft:jmp fir

jmp p0
;****************************************write number in digit***************
wdi:
inc h
nummul x
mov al,a
mov ah,0
add x,ax
; jmp endwdi
endwdi: jmp endl
;***************************************write ope**************************
wop: cmp s,0 ;if s==0 yani hanoz adadi dar sum zakhireh nashodeh
jz wop2
cmp op,1
jnz w1
jmp wo0
l1: mov s,0
jmp fir
w1: cmp op,0
jnz endw
mov s,0
mov m,0
mov a,0
mov x,0h
mov sum,0
mov op1,0
jmp fir
wop2: mov s,1
mov ax,x
mov sum,ax
mov al,op
mov op1,al
mov x,0h
window1 3,2,21,5,24h
endw: jmp fir
;*****************************************jmp to continue code*******************

;*************************************operation*** ****************
wo0: cmp op1,2 ;op='/'
jnz wo1
cmp x,0
jz err
mov ax,sum
mov cx,x
div cl
mov ah,0
mov sum,ax
mov x,ax
jmp endw1
err: gotoxy1 14,3
puts1 stcan
jmp endw1
wo1: cmp op1,3 ;op='*'
jnz wo2
mov ax,sum
mul x
mov sum,ax
mov x,ax
jmp endw1
wo2: cmp op1,4 ;op='-'
jnz wo3
mov cx,sum
mov ax,x
sub cl,al
sbb ch,ah
mov sum,cx
mov x,cx
jmp endw1
wo3: cmp op1,5 ;op='+'
jnz endw1
mov ax,x
mov cx,sum
add al,cl
adc ah,ch
mov sum,ax
mov x,ax

endw1: strcpy stsum
gotoxy1 14,3
itoa1 x,stsum
puts1 stsum
gotoxy1 3,3
puts1 stcls
getch2
getch2
mov op,0
jmp wop
;************************************************* ****************
p0:

exit: exit1
main endp
codesg ends
end main

xman_1365_x
چهارشنبه 29 تیر 1390, 00:31 صبح
قبلا خطاهاشو گرفته بودم اما یادم رفته بود آپلود کنم:لبخند: تازه الان تاپیک رو دیدم
سورس به همراه فایل آبجکت و فایل اجرایی
72661

ahangari365
یک شنبه 02 مرداد 1390, 13:57 عصر
مهندس ممنون از اینکه کمکم کردی..ولی برنامه ای که ضمیمه کردی رو باز کردم و فایل PRJCALC.ASM همراه با فایلهای string.lib وMAC1.LIB رو اجرا کردم که لاقل خودم یه اجرا بگیرم که باز 21 تا error server میده . مشکل کجاست؟

xman_1365_x
دوشنبه 03 مرداد 1390, 05:23 صبح
مهندس ممنون از اینکه کمکم کردی..ولی برنامه ای که ضمیمه کردی رو باز کردم و فایل PRJCALC.ASM همراه با فایلهای string.lib وMAC1.LIB رو اجرا کردم که لاقل خودم یه اجرا بگیرم که باز 21 تا error server میده . مشکل کجاست؟

در اجرا كردن فايل اجرايي كه مشكلي ندارين درسته؟
در اين فايلي كه ضميمه ميكنم دوتا عكس از طريقه اسمبل كردن رو نشون ميده(راه سوم به كمك batch code) به همراه ورژن اسمبلر اگر شما از همين ورژن استفاده ميكنيد نبايد مشكلي باشه
اگر بازم مشكل حل نشد خروجي برنامه رو به همراه نسخه سيستم عاملتون به صورت كامل ذكر كنيد.
72884
موفق باشي

ahangari365
دوشنبه 03 مرداد 1390, 11:09 صبح
مهندس اون فایل اجرایی اجرا میشه .
اون پروجکت رو که اجرا کردم یه سری خطا داره که ضمیمه کردم .همانطوری که گفته بودی مشخصات سیستم عامل+ خطاهای موقع اجرا.

xman_1365_x
دوشنبه 03 مرداد 1390, 12:07 عصر
مهندس اون فایل اجرایی اجرا میشه .
اون پروجکت رو که اجرا کردم یه سری خطا داره که ضمیمه کردم .همانطوری که گفته بودی مشخصات سیستم عامل+ خطاهای موقع اجرا.
دوست عزیز مشکل بخاطر ورژن اسمبلر شماست که دستورات پردازنده های 32 بیت رو نمیشناسه پس بازه پرش های شرطی محدود به 128- تا 127 بایت از ثبات IP هست و چون پرش ها بیشتر از این بازه هست خطا out of range داده
برای حل این مشکل دو راه هست
1-راه آسون ورژن جدید masm رو دانلود کنید! از نسخه 6 به بعد دستورات 32 بیتی هم میشناسه و در نسخه 8 به بعد دستورات 64 بیتی رو با این کار نیازی به تغییر کد ها ندارین
2-با همین اسمبلر و ترکیب پرش شرطی با پرش بدون شرط یعنی با jmp label انجام بدین و نیازی به jmp far ptr label نیست چون در عکس ضمیمه شده محدوده ها کوچیک هستن
لینک دانلود masm (http://www.phatcode.net/downloads.php?sub=compilers)
masm32 (http://www.masm32.com/masmdl.htm)
ms masm (http://www.microsoft.com/download/en/details.aspx?id=12654)
موفق باشی