ورود

نسخه کامل مشاهده نسخه کامل : مشکل اسمبلی



saeed_136915
01-06-2011, 19:37
سلام دوستان من این رو نوشتم ولی قسمت آخرش که تعداد کلمات رو شمارش میکنه اشتباهه. نمی دونم چجوری باید به file_buffer اشاره کنم. اگه به file_buffer اشاره بشه به آدرس اون اشاره میشه یا داده اون؟؟
لطفا توضیح بدین. خیلی ممنون



.model small
.stack 64
.data
file_path db "C:\f1.asm",0
file_buffer db 100 dup(?)
file_handler dw ?
notice1 db 'Enter File Location : $'
counter db 0
eofbuff dw ?
pointer dw ?
;************************************

.code
main proc far
mov ax,@data
mov ds,ax

;****Open File***********************

mov ah,3dh
mov al,0
lea dx,file_path
int 21h
;jc readerror
mov file_handler,ax

;readerror:
;mov ah,09
;lea dx,notice1
;int 21h
;****Read form File to Buffer******************************

mov ah,3fh
mov cx,2
mov bx,file_handler
lea dx,file_buffer
int 21h
;****Close File*************************

mov ah,3eh
mov bx,file_handler
int 21h
;************************

mov pointer,offset file_buffer
mov eofbuff,offset file_buffer
add eofbuff,64h
loop1:
inc counter
loop2:
add pointer,1h
cmp byte ptr pointer,byte ptr eofbuff
je exit
cmp pointer,'?'
je exit
cmp pointer,' '
je loop1
jmp loop2

exit:
mov ah,02
mov dl,counter
int 21h



mov ah,4ch
int 21h
main endp
end main

saeed_136915
02-06-2011, 09:53
کسی جواب نمیده؟؟:41:

hoax3r
03-06-2011, 13:18
یکی از ایرادای کدت اینجاست


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

همچین دستوری اصلا نمیشه استفاده کرد، منظورم دو اپرند مموری باشن، باید یکی مموری باشه مثلا یکی هم رجیستر

بعد جدای از اینا منطقا هم کد مشکل داره شما مقداری که pointer و eofbuff بهش اشاره میکنند رو مقایسه میکنید و این ایجاد مشکل میکنه
در حالی که درست اینه که خود پوینترها که در واقع آدرسها میشه رو باید با هم مقایسه کنید،

به نظرم بهتر اینه که به جای مقایسه با آخر بافر، تعداد بایت های خونده شده با تابع 3F رو برسی کنید چون اون تابع این مقدارو برمی گردونه تو ax میریزه

برای دسترسی به داده file_buffer هم بهتره آدرسو بریزین تو یه رجیستر مثل si بعد ازش بخونین،


برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

هر جا pointer هست بجاش si میاد، البته اینجوری

برای مشاهده محتوا ، لطفا وارد شوید یا ثبت نام کنید

در آخر اینکه تابع 2 از وقفه ی 21h باید از نوع اسکی باشه نه عدد، یعنی اگه تعداد 3 هست باید به 33h تبدیل بشه تا بشه چاپش کرد، یا اگه دو رقمی هست هر رقم جدا به اسکی باید تبدیل بشه

saeed_136915
03-06-2011, 19:12
ممنون درستش کردم فقط اگه تعداد کلمات تا 9 باشه نشون میده .

اگه دو رقمی هست هر رقم جدا به اسکی باید تبدیل بشه چطوری؟
خیلی ممنون

hoax3r
03-06-2011, 22:22
ممنون درستش کردم فقط اگه تعداد کلمات تا 9 باشه نشون میده .
چطوری؟
خیلی ممنون

عدد باقیماندش به 10 : رقم اول،
عدد تقسیم به 10
عدد باقیماندش به 10 : رقم دوم
الا آخر

saeed_136915
04-06-2011, 20:31
سلام آقا دستت درد نکنه درست شد به کمک شما :11: فقط یه سوال دیگه میشه بگین دستور push چیکار میکنه؟؟

saeed_136915
05-06-2011, 17:49
دوستان خواهشا کمک کنین. من اینو نوشتم ولی خروجیش این میشه(ch=11) :
;0 چرا؟؟؟


MOV AL,CL
MOV AH,0
I DB 10
DIV I
MOV BL,AL
MOV BH,AH
ADD BL,48
ADD BH,48
MOV AH,02
MOV DL,BH
INT 21H
MOV DL,BL
INT 21H

hoax3r
06-06-2011, 20:30
فقط یه سوال دیگه میشه بگین دستور push چیکار میکنه؟؟

این دستور یه مقدارو میریزه تو حافظه ی استک


دوستان خواهشا کمک کنین. من اینو نوشتم ولی خروجیش این میشه(ch=11) :
ch از کجا اومد
کدت به نظر درسته البته فعلا نمیتونم تست کنم
در ضمن بیشتر توضیح بده چیکار کردی یا کده کامل بزار

saeed_136915
06-06-2011, 21:21
این دستور یه مقدارو میریزه تو حافظه ی استک


ch از کجا اومد
کدت به نظر درسته البته فعلا نمیتونم تست کنم
در ضمن بیشتر توضیح بده چیکار کردی یا کده کامل بزار

ممنون درست شد. ch تعداد کلمه هاس . وقتی 10 رو تو i ذخیره میکنم و div رو اجرا میکنم اصلا AL و AH تغییر نمیکنه ولی وقتی توی DL ذخیره میکنم درست اجرا میشه نمیدونم چرا :13::31: