View Full Version : خطا در هنگام اسمبل کردن برنامه
mr_esmaily
دوشنبه 30 مرداد 1385, 22:18 عصر
سلام
ظاهراً کد زیر نباید مشکلی داشته باشه
;---------------------------------------------------------------
; EAT.ASM
; Backhanded advertising program
;
; by Jeff Duntemann
; MASM/TASM
; Last update 3/5/89
;---------------------------------------------------------------
;----------------------------|
; BEGIN STACK SEGMENT |
;----------------------------|
MyStack SEGMENT STACK ; STACK word ensures loading of SS by DOS
DB 64 DUP ('STACK!!!') ; This reserves 512 bytes for the stack
MyStack ENDS
;----------------------------|
; END STACK SEGMENT |
;----------------------------|
;----------------------------|
; BEGIN DATA SEGMENT |
;----------------------------|
MyData SEGMENT
Eat1 DB "Eat at Joe's...",'$'
CRLF DB 0DH,0AH,'$'
MyData ENDS
;----------------------------|
; END DATA SEGMENT |
;----------------------------|
;----------------------------|
; BEGIN CODE SEGMENT |
;----------------------------|
MyProg SEGMENT
assume CS:MyProg,DS:MyData
Main PROC
Start: ; This is where program execution begins:
mov AX,MyData ; Set up our own data segment address in DS
mov DS,AX ; Can't load segment reg. directly from memory
lea DX,Eat1 ; Load offset of Eat1 message string into DX
mov AH,09H ; Select DOS service 09H: Print String
int 21H ; Call DOS
lea DX,CRLF ; Load offset of CRLF string into DX
mov AH,09H ; Select DOS service 09H: Print String
int 21H ; Call DOS
mov AH,4CH ; Terminate process DOS service
mov AL,0 ; Pass this value back to ERRORLEVEL
int 21H ; Control returns to DOS
Main ENDP
MyProg ENDS
;----------------------------|
; END CODE SEGMENT |
;----------------------------|
END Start
ولی موقع اسمبل کردن با NASM خطا هایی رو که تو عکس زیر گذاشتم میده
raha_hakhamanesh
چهارشنبه 01 شهریور 1385, 10:17 صبح
خطا های استک رو تصحیح کنید . . .
MyStack SEGMENT para 'stack' ;stack into comma
64 بایت با مقدار پیش فرض 0 DB 64 DUP ('0') ; this
داخل پرانتز رشته نمی تواند باشد حتما فقط یک کاراکتر !!!
MyStack ENDS
البته توجه کنید اینکه گفتم داخل پرانتز یک کاراکتر بگذارید برای بعضی اسمبلر ها است ... بهتره رعایت بشه
raha_hakhamanesh
چهارشنبه 01 شهریور 1385, 10:25 صبح
برای قسمت data segment هم بهتره کلمه para در مقابل اون ذکر بشه به نحو زیر
Mydata Segment Para 'Data' ; para is for alignment in memory
----------------------------
برای بخش سگمت کد به ترتیب زیر رعایت شود
MAIN Proc FAR
ذکر کلمه far مهم و در صورت عدم وجود آن تعبیر دیگری از متن برنامه می شود (البته اگر منظورتون الزاما همان نباشد آیا قصد دارید کد شما قسمتی از یک برنامه دیگر باشد در این صورت ذکر کلمه near ضروری است)
سایر خطا ها به همان error های بالا مربوط می شود یعنی اگر موارد ذکر شده تصحیح گردد احتمالا دیگر خطایی نخواهد داشت مثلا خطای
Myprog Redefined
مربوط به همان ذکر کلمه FAR می شود
-----------------------------------------------
موفق باشید
mr_esmaily
چهارشنبه 01 شهریور 1385, 15:33 عصر
سلام
این کدها ماله یه کتابه , اونم کتابی که ویرایش اولش 10 سال زیر چاپ بوده تا سال 2000 که ویرایش دومش رو نویسندش نوشت , هنوز هم زیره چاپه !
ممکنه مشکل در تنظیمات NASM-IDE یا مشکله خوده اسمبلر باشه ؟ مثلا بد دانلود شدن یا موارده دیگه , چون کلیه ابزار لازم رو از اینترنت گرفتم ( هرکدومش از یه جا ! )
در مورده راهنمایی جناب "raha_hakhamanesh " ممنون ولی عجیب اینجاست که با اولین ویرایش خطای زیر هم اضافه شد !
کد
MyStack SEGMENT STACK
رو به
MyStack SEGMENT para 'stack'
تغییر دادم و نتیجش این شد :
segment name 'para' not recognised
ممکنه دوستانی که NASM رو سیستمشون نصبه , این کد رو امتحان کنند و نتیجه رو بگن ؟
با تشکر.
PalizeSoftware
شنبه 11 شهریور 1385, 22:05 عصر
سلام
دوست عزیز این کد باید با Masm کمپایل بشه نه Nasm
شیوه کد و معرفی sectionها برای Masm و Nasm تا حدودی متفاوت هست
با Masm تست کنید مشکلی نداره
mr_esmaily
یک شنبه 12 شهریور 1385, 12:57 عصر
سلام
کتابی که دارم میخونم با NASM گفته , بماند , من MASM32 رو نصب کردم , نتیجش این شد :
Assembling: C:\Documents.asm
C:\Documents.asm(1) : error A2008: syntax error : [
C:\Documents.asm(2) : error A2008: syntax error : SEGMENT
C:\Documents.asm(3) : error A2008: syntax error : .
C:\Documents.asm(18) : error A2034: must be in segment block
C:\Documents.asm(19) : error A2034: must be in segment block
C:\Documents.asm(20) : error A2034: must be in segment block
C:\Documents.asm(21) : error A2034: must be in segment block
C:\Documents.asm(22) : error A2034: must be in segment block
C:\Documents.asm(23) : error A2034: must be in segment block
C:\Documents.asm(24) : error A2034: must be in segment block
C:\Documents.asm(25) : error A2034: must be in segment block
C:\Documents.asm(26) : error A2034: must be in segment block
C:\Documents.asm(27) : error A2034: must be in segment block
C:\Documents.asm(28) : error A2008: syntax error : SEGMENT
C:\Documents.asm(29) : error A2034: must be in segment block
C:\Documents.asm(30) : error A2008: syntax error : SEGMENT
C:\Documents.asm(34) : error A2008: syntax error : resb
C:\Documents.asm(35) : error A2034: must be in segment block
C:\Documents.asm(37) : error A2088: END directive required at end of file
Volume in drive C has no label.
Volume Serial Number is 807D-D643
Directory of C:\
09/02/2006 11:22 PM 1,910 Documents.asm
1 File(s) 1,910 bytes
0 Dir(s) 851,607,552 bytes free
ممکنه مشخصات کامل اسمبلر رو بدین ( نسخه و در صورته امکان لینک دریافتش )
PalizeSoftware
یک شنبه 12 شهریور 1385, 23:56 عصر
سلام
این هم اسمبلر مربوطه به همراه فایلهای کامپایل شده.
طریقه کامپایل هم اینطوری هست:
MASM test;
Link Test;
موفق باشید
mr_esmaily
دوشنبه 13 شهریور 1385, 00:55 صبح
سلام
خیلی لطف کردین ولی چندتا سوال :
اون پارامترهایی که موقع اسمبل یا لینک کردن میگیره مربوط به چیه و فایل هایی مثل "MASM Listing" یا "Linker Address Map" به چه منظوری هستن ؟
در ضمن , الان یه کد دیگه از هون کتاب رو با MASM اسمبل کردم ولی موقع لینک کردن خطای زیر رومیده :
error L2049: no segments defined
کد برنامه هم اینه :
; Source name : EAT2.ASM
; Executable name : EAT2.COM
; Code model : Real Mode Flat Model
; Version : 1.0
; Created date : 7/31/1999
; Last update : 9/11/1999
; Author : Jeff Duntemann
; Description : A simple example of a DOS .COM file programmed using
; NASM-IDE 1.1 and NASM 0.98 and incorporating procedures.
[BITS 16] ; Set 16 bit code generation
[ORG 0x0100] ; Set code start address to 100h (COM file)
[SECTION .text] ; Section containing code
Start:
mov DX,EatMsg1 ; Load offset of Eat1 string into DX
call Writeln ; and display it
mov DX,EatMsg2 ; Load offset of Ear2 string into DX
call Writeln ; and display it
mov ax, 04C00H ; This function exits the program
int 21H ; and returns control to DOS.
;----------------------------------------|
; PROCEDURE SECTION |
;----------------------------------------|
Write:
mov AH,09H ; Select DOS service 9: Print String
int 21H ; Call DOS
ret ; Return to the caller
Writeln:
call Write ; Display the string proper through Write
mov DX,CRLF ; Load offset of newline string to DX
call Write ; Display the newline string through Write
ret ; Return to the caller
;----------------------------------------|
; DATA SECTION |
;----------------------------------------|
[SECTION .data] ; Section containing initialised data
EatMsg1 DB "Eat at Joe's...",'$'
EatMsg2 DB "...ten million flies can't ALL be wrong!",'$'
CRLF DB 0DH,0AH,'$'
با تشکر.
PalizeSoftware
دوشنبه 13 شهریور 1385, 04:21 صبح
سلام
اون فایلها رو اسمبلر ایجاد میکنه.
فایل لیست حاوی کدهای ترجمه شده هست
فایل لینکری هم که تولید میشه برای تولید آدرسهایی هست که هنوز مقدار دقیقی از اونها در دست نیست. بعنوان مثال فرض کنید که شما دستور پرشی رو در ابتدا انجام دادید به مقصدی که اسمبلر هنوز به آدرس مقصد نرسیده که اون رو ترجمه کنه و آدرس دقیقی از اون رو به دست بیاره. بنابراین یه آدرس موقت براش در نظر میگیره
در ضمن این سورس هم مربوط به فایل com هست که این پیام اخطار رو میده (خطا نیست)
اگه در سورس دقت کنید این عبارت اومده:
A simple example of a DOS .COM file programmed
موفق باشید
mr_esmaily
دوشنبه 13 شهریور 1385, 16:05 عصر
سلام
از جوابتون ممنون ولی این اخطار رو هم میده :
no stack segment
چجوری فایل COM. موقع لینک کردن ایجاد کنم ؟
PalizeSoftware
دوشنبه 13 شهریور 1385, 19:24 عصر
سلام
از جوابتون ممنون ولی این اخطار رو هم میده :
چجوری فایل COM. موقع لینک کردن ایجاد کنم ؟
سلام
فایلهای com نسبت به فایلهای exe تفاوتهایی دارن. از جمله این تفاوتها این هست که یک فایل com نمیتونه بیش از 64 کیلوبابت اندازه داشته باشه. چون هر فایل com در یک code segment قرار میگیره ولی فایلهای exe میتونن با هر اندازهای و هر تعداد code segment داشته باشن.
این اخطار رو هم به این دلیل میده که شما بدونید فایل شما stack segment نداره و در قالب com باید لینک بشه.
بعد از اینکه توسط لینکر فایل خروجی exe تولید شد، هنوز یک قدم دیگه برای com شدن باقی میمونه که با دستور زیر تبدیل به com خواهد شد:
exe2bin test.exe test.com
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.