ورود

View Full Version : اشاره گر اسلمبلی



BestFriend
پنج شنبه 17 دی 1388, 20:04 عصر
با سلام

من میخوام BX به یه خونه از حافظه یا یه ثبات اشاره کنه باید چی کار کنم؟
در ضمن [BX] یعنی چی؟

با تشکر

tdkhakpur
پنج شنبه 17 دی 1388, 21:30 عصر
شما فقط میتوانید به حافظه موجود در ram اشاره کنید و به رجیستر به عنوان اشاره گر نمیتوان دسترسی داشت.


str db 'hi my friend'
lad bx, str

با عمل فوق شما به محل حافظه str در حافظه از طریق bx دسترسی و اشاره میکنید.


mov al, '1'
mov byte ptr [bx], al

با کد فوق رشته بصورت زیر تغییر میکند.
'1i my friend'

babol-hacker
جمعه 18 دی 1388, 02:17 صبح
با اجازه از این دوستمون که توضیح دادن منم کاملش کنم

اشاره گرهایی که میشه ازشون استفاده کرد BX,SP,BP,SI,DI که BX هم جز اوناست
اشاره گر ها آفست یا همون ادرس اون خونه از حافظه یا همون آدرس بایت اول متغییر را نسبت به ابتدای سگمنت مشخص میکنند
در واقع وقتی اشاره گر به ادرس یک متغییر اشاره کنه ازین به بعد وقتی مینویسیم [BX] یعنی محتوای جایی که اشاره گر ما بهش اشاره داره

یکی از کاربرد های دیگه هم اینه که میتونیم BX+1 یا 2 یا بیشتر کنیم که چون به اولین خونه اشاره میکنه +1 یعنی بایت بعدی و به همین صورت جلوتر....

برای اشاره کردنم دوتا دستوره

LEA BX,STR


MOV BX,OFFSET STR




چون BX فقط آدرس شروع و نگه میداره و درمورد میزان فضای اشغالی متغییری که بهش اشاره میکنه اطلاعی نداره (مثلا چند بایته) به خاطر همین از BYTE PTR یا WORD PTR استفاده میکنیم



MOV [BX],AH
MOV [BX],5H

دستور اول درسته چون میدونه AH یک بایته و به اندازه یک بایت از افستی که BX بهش اشاره میکنه شروع به نوشتن میکنه
دستور دوم اشتباه چون مشخص نیست عدد ما چند بایتیه به همین خاطر

MOV BYTE PTR [BX],5H
MOV WORD PTR[BX],5H ;005H IN [BX]

اولیبه اندازه یک بایت و دومی دو بایت



MOV [BX]+1,5H
MOV [BX+1],5H
MOV 1[BX],5H


همه معادل هم هستن یعنی به یک خانه بعد از جایی که BX به آن اشاره میکند


پر حرفی کردم ببخشید

BestFriend
جمعه 18 دی 1388, 10:16 صبح
با سلام مجدد
ممنون از جواب هایی که دادید خیلی مفید بود ولی یه سوال دیگه هم داشتم.
این کد عدد رو به رشته تبدیل میکنه ولی چرا قبل از تبدیل عدد رو به 10 تقسیم میکنه؟ یا در برعکس اون برای تبدیل رشته به عدد رشته رو در 10 ضرب میکنه؟



mov cx,10
l1:
div cx ;بر 10 تقسيم ميشود AX
add dl,30h
mov [bx],dl
dec bx
cmp ax,0
jne l1


با تشکر.

babol-hacker
جمعه 18 دی 1388, 10:35 صبح
سلام من تا حالا همچین کاری نکردم دو روز دیگه هم امتحان اسمبلی دارم اگه همچبن چبزی و یاد گرفتم میارم اینجا کدشو

http://www.barnamenevis.org/forum/showthread.php?p=769084

این لینک بالا هم تو همین سایت ببین توش یک ماکرو بدرت میخوره

بازم میگم شاید کی بلد نباشه از کدی اما اگه کد برنامه و یک جورایی کامل بزارین شاید تونستیم از بالا به پایین تحلیلش کنیم

babol-hacker
جمعه 18 دی 1388, 10:48 صبح
شرمنده اصلا نمیخوام روش فکر کنم آخه اگه بخوام فکر کنم دیگه از درس میوفتم خیلی گیرم تا یک کد و بدس نیاوردم ول نمیکنم:افسرده:

http://www.jozve-computer.blogfa.com/post-62.aspx

http://www.daniweb.com/forums/thread164873.html#

http://www.programmingforums.org/thread17429.html


google + convert string to number assembly code

tdkhakpur
جمعه 18 دی 1388, 10:52 صبح
این کد عدد رو به رشته تبدیل میکنه ولی چرا قبل از تبدیل عدد رو به 10 تقسیم میکنه؟ یا در برعکس اون برای تبدیل رشته به عدد رشته رو در 10 ضرب میکنه؟

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


13254 // عدد
13254 div 10 ---> خارج قسمت = 1325 و باقیمانده = 4
1325 div 10 ---> خارج قسمت = 132 و باقیمانده = 5

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


1325 // رشته
0 *10 + 1 = 1
1 *10 + 3 = 13
13 *10 + 2 = 132
132*10 + 5 = 1325

BestFriend
شنبه 19 دی 1388, 19:33 عصر
یه سوال دیگه هم داشتم که آخرین سوال هست :
میخوام ببینم که چه طوری میشه به خونه های یه آرایه دسترسی داشت؟
مثلا تو سی منویسیم


a[9]

تو اسمبلی چه طوری باید به خونه ی متغیری که اینطوری تعریف شده دست پیدا کنیم؟


a1 db 50 dup(?)

tdkhakpur
شنبه 19 دی 1388, 19:50 عصر
a1 db 50 dup(?)
lea bx, a1
mov al, 's'
mov byte ptr [bx], al ; ایندکس اول
mov byte ptr [bx+1], al ; دوم
mov byte ptr [bx+2], al ; سوم
mov byte ptr [bx+3], al ; و الی آخر

BestFriend
یک شنبه 20 دی 1388, 10:56 صبح
خیلی خیلی خیلی عذر میحوام که سوال هام زیاد شد ولی یه سوال دیگه:
من وقتی این کد رو مینویسم هیچ رشته ای دریافت نمیکنه چرا؟
دیتا سگمنت:

a1 dw ?
کد سگمنت:


mov ah , 0ah
lea dx,a1
int 21h

هیچ ایرادی هم نمیگیره فقط این کد رو رد میکنه و هیچ اتفاقی نمیفته
ولی وقتی رشته با دستور label تعریف میکنم رشته رو میگیره و یا وقتی که a1 رو مقدار دهی میکنم هم کار میکنه.

باز هم ببخشید که زیاد سوال کردم.

با تشکر.

tdkhakpur
یک شنبه 20 دی 1388, 14:00 عصر
int 21h برای ورودی رشته احتیاج به تنظیم پارامتر دارد که شما باید بصورت زیر انرا تنظیم کنید



StrParameter LABEL BYTE
Len db 20
RtnLen db ?
Text db 20 dup(?)

mov ah , 0ah
lea dx,StrParameter
int 21h

این موارد قانونی هست که باید رعایت شود تا وقفه 21H بتوانبد از پارامتر ها استفاده نماید.

BestFriend
یک شنبه 20 دی 1388, 20:58 عصر
ممنون من کد قبلی که برای پیمایش آرایه رو نوشته بودید به صورت زیر امتحان کردم ولی وجواب نداد.


mov ax,inputstr
mov word ptr [si+i] ,ax

tdkhakpur
یک شنبه 20 دی 1388, 21:48 عصر
mov ax,inputstr
mov word ptr [si+i] ,ax

این کدی که شما نوشتید از لحاظ syntax ایرادی ندارد فقط الگوریتم شما در مورد آدرس دهی اشتباهه


mov ax,inputstr
mv bx, 123
mov cx, 10 ; طول رشته
again:
mov word ptr [si] , bx ; مقدار دهی به آرایه
add si, 2 ; محل بعدی از آرایه
loop again