PDA

View Full Version : error 85: End of file, no END directive



MostafaMohammadi
یک شنبه 27 فروردین 1391, 00:34 صبح
سلام

من این برنامه رو در emu8086 version 4.08 نوشتم و بدون هیچ پیغام خطایی Emulate میشه:


; ------------------------------
; | 1- Introducing the program |
; ------------------------------
TITLE 'REVERSE.ASM' Print the reverse of a string
;
; ---------------------------------
; | 2- Defining the Stack segment |
; ---------------------------------
SSEG SEGMENT
DD 100 DUP('ST')
SSEG ENDS
;
; --------------------------------
; | 3- Defining the Data segment |
; --------------------------------
DSEG SEGMENT
STR DB 64 DUP(0)
REV DB 64 DUP(0)
COUNT DB 0
DSEG ENDS
;
; --------------------------------
; | 4- Defining the Code segment |
; --------------------------------
CSEG SEGMENT
ASSUME CS:CSEG, DS:DSEG, SS:SSEG
START PROC FAR
MOV AX,DSEG
MOV DS,AX
;
; -------------------------------------
; | 5- Getting a string from keyboard |
; -------------------------------------
LEA BX,STR
l1: MOV AH,01H
INT 21H
CMP AL,13
JE L2
MOV [BX],AL
INC BX
JMP L1
L2: MOV [BX],'$'
;
; --------------------------
; | 6- Clearing the screen |
; --------------------------
MOV AH,07H
MOV AL,00H
MOV BH,07H
MOV CX,0000H
MOV DX,184FH
INT 10H
;
; ---------------------------------
; | 7- Going to line 10, column 5 |
; ---------------------------------
MOV AH,2H
MOV BH,00H
MOV DH,10
MOV Dl,5
INT 10H
;
; --------------------------
; | 8- Printing the string |
; --------------------------
MOV AH,09H
LEA DX,STR
INT 21H
;
; ---------------------------------------
; | 9- Counting the length of the string |
; ---------------------------------------
LEA BX,STR
L3: MOV DL,[BX]
CMP DL,'$'
JE L4
INC COUNT
INC BX
JMP L3
;
; ---------------------------------------
; | 10- Saving the reverse of the string |
; ---------------------------------------
L4: LEA BX,REV
MOV DH,0
MOV DL,COUNT
ADD BX,DX
MOV [BX],'$'
DEC BX
LEA SI,STR
L5: CMP [SI],'$'
JE L6
MOV DH,[SI]
MOV [BX],DH
INC SI
DEC BX
JMP L5
; ----------------------------------
; | 11- Going to line 11, column 5 |
; ----------------------------------
L6: MOV AH,2H
MOV BH,00H
MOV DH,11
MOV Dl,5
INT 10H
;
; ------------------------------------------
; | 12- Printing the reverse of the string |
; ------------------------------------------
MOV AH,09H
LEA DX,REV
INT 21H
;
; --------------------------
; | 13- End of the program |
; --------------------------
START ENDP
CSEG ENDS
END START

ولی وقتی می خوام همین برنامه رو از طریق MASM کامپایل کنم چندین پیغام خطا میده.


85767


میشه راهنمایی ام کنید؟

xman_1365_x
یک شنبه 27 فروردین 1391, 01:28 صبح
به تغییرات توجه کنید ، قبل از پرسیدن سوال در مورد دستورات به کار رفته در تالار جستجو کنید.



; ------------------------------
; | 1- Introducing the program |
; ------------------------------
TITLE 'REVERSE.ASM' Print the reverse of a STR1ing

.286

;
; ---------------------------------
; | 2- Defining the Stack segment |
; ---------------------------------
SSEG SEGMENT stack
DD 100 DUP('ST')
SSEG ENDS
;
; --------------------------------
; | 3- Defining the Data segment |
; --------------------------------
DSEG SEGMENT
STR1 DB 64 DUP(0)
REV DB 64 DUP(0)
COUNT DB 0
DSEG ENDS
;
; --------------------------------
; | 4- Defining the Code segment |
; --------------------------------
CSEG SEGMENT
ASSUME CS:CSEG, DS:DSEG, SS:SSEG
START PROC FAR
MOV AX,DSEG
MOV DS,AX
;
; -------------------------------------
; | 5- Getting a STR1ing from keyboard |
; -------------------------------------
LEA BX,STR1
l1: MOV AH,01H
INT 21H
CMP AL,13
JE L2
MOV [BX],AL
INC BX
JMP L1
L2: MOV byte ptr [BX],'$'
;
; --------------------------
; | 6- Clearing the screen |
; --------------------------
MOV AH,07H
MOV AL,00H
MOV BH,07H
MOV CX,0000H
MOV DX,184FH
INT 10H
;
; ---------------------------------
; | 7- Going to line 10, column 5 |
; ---------------------------------
MOV AH,2H
MOV BH,00H
MOV DH,10
MOV Dl,5
INT 10H
;
; --------------------------
; | 8- Printing the STR1ing |
; --------------------------
MOV AH,09H
LEA DX,STR1
INT 21H
;
; ---------------------------------------
; | 9- Counting the length of the STR1ing |
; ---------------------------------------
LEA BX,STR1
L3: MOV DL,[BX]
CMP DL,'$'
JE L4
INC COUNT
INC BX
JMP L3
;
; ---------------------------------------
; | 10- Saving the reverse of the STR1ing |
; ---------------------------------------
L4: LEA BX,REV
MOV DH,0
MOV DL,COUNT
ADD BX,DX
MOV byte ptr [BX],'$'
DEC BX
LEA SI,STR1
L5: CMP byte ptr [SI],'$'
JE L6
MOV DH,[SI]
MOV [BX],DH
INC SI
DEC BX
JMP L5
; ----------------------------------
; | 11- Going to line 11, column 5 |
; ----------------------------------
L6: MOV AH,2H
MOV BH,00H
MOV DH,11
MOV Dl,5
INT 10H
;
; ------------------------------------------
; | 12- Printing the reverse of the STR1ing |
; ------------------------------------------
MOV AH,09H
LEA DX,REV
INT 21H
;
; --------------------------
; | 13- End of the program |
; --------------------------

; wait for any key....
mov ah, 1
int 21h

mov ax, 4c00h ; exit to operating system.
int 21h

START ENDP
CSEG ENDS
END START


موفق باشی

MostafaMohammadi
یک شنبه 27 فروردین 1391, 10:30 صبح
سلام xman_1365_x (http://barnamenevis.org/member.php?33193-xman_1365_x) عزیز،

سپاسگذار، اون BYTE PTR ها مشکل error 35: Operand must have size رو حل کرد.
اون .286 در خط ششم به نظر درست میاد (+ (http://msdn.microsoft.com/en-us/library/43dekb6y%28v=vs.71%29.aspx)) ولی نمی دونم چرا بهش error 10: Syntax error می گیره.
ولی اون تکه کدی که به انتهای برنامه اضافه کردید، مشکل error 85: End of file, no END directive رو حل نکرد و همچنان این خطا رو به خط آخر برنامه نسبت میده. (من قبلا که به این مشکل بر می خوردم، دستور RET رو به برنامه اضافه می کردم و این مشکل رفع می شد ولی الان این ترفند هم مشکل ام رو حل نمی کنه.)

85782

راستی اینکه اسم متغییر رشته ای STR رو به STR1 تغییر دادید دلیل خاصی داشت؟ چون من چک کردم دیدم STR کلمه رزرو شده نبود.

xman_1365_x
یک شنبه 27 فروردین 1391, 13:49 عصر
اون .286 در خط ششم به نظر درست میاد (+) ولی نمی دونم چرا بهش error 10: Syntax error می گیره.
من در masm6 درستش کردم و باید به اسمبلر معرفی میکردم، شما از masm4 استفاده میکنید که قدیمی هست و این دستور رو نمیشناسه پس نیازی نیست بنویسید چون این ورژن 16 بیت اسمبلر هست


ولی اون تکه کدی که به انتهای برنامه اضافه کردید، مشکل error 85: End of file, no END directive رو حل نکرد و همچنان این خطا رو به خط آخر برنامه نسبت میده. (من قبلا که به این مشکل بر می خوردم، دستور RET رو به برنامه اضافه می کردم و این مشکل رفع می شد ولی الان این ترفند هم مشکل ام رو حل نمی کنه.)
اون قسمت برای خطا دیگری هست که NTVDM خطا نگیره ! در masm 4 کافیه یک END هم در آخر این کد ها بنویسید تا بدرستی اسمبل شه

راستی اینکه اسم متغییر رشته ای STR رو به STR1 تغییر دادید دلیل خاصی داشت؟ چون من چک کردم دیدم STR کلمه رزرو شده نبود.
در masm 6 جزء کلمات رزور شده هست در masm4 مطمئن نیستم

نتیجه:شما .286 رو حدف کنید و در آخر کد END بنویسید بدرستی اسمبل میشه
موفق باشی

MostafaMohammadi
یک شنبه 27 فروردین 1391, 23:08 عصر
من در masm6 درستش کردم و باید به اسمبلر معرفی میکردم، شما از masm4 استفاده میکنید که قدیمی هست و این دستور رو نمیشناسه پس نیازی نیست بنویسید چون این ورژن 16 بیت اسمبلر هست


اون قسمت برای خطا دیگری هست که NTVDM خطا نگیره ! در masm 4 کافیه یک END هم در آخر این کد ها بنویسید تا بدرستی اسمبل شه

در masm 6 جزء کلمات رزور شده هست در masm4 مطمئن نیستم

نتیجه:شما .286 رو حدف کنید و در آخر کد END بنویسید بدرستی اسمبل میشه
موفق باشی
این تغییرات مشکل رو کاملا حل کرد.
در مورد STR هم حق با شما است، در ورژن 6 MASM یک کلمه رزو شده است، البته در ورژن 4 رزرو شده نیست ولی همون بهتر که تا حد امکان کدهام با ورژن های بعدی MASM سازگار باشه.


سپاسگذار بابت راهنمایی هاتون.