PDA

View Full Version : هر کی هر قدر از اسمبلی سر در میاره بیاد تو این تاپیک



Ghasem Dehghani
سه شنبه 29 خرداد 1386, 19:05 عصر
با سلام
دوستان من تازه اسمبلی رو شروع کردم و برای شروع هم برنامه یک ماشین حساب با چهار عمل اصلی را برای شروع مطالعه میکنم لطفا هر کسی که از قسمتی یا تمام اونها اطلاع داره راهنمایی کنه .
در ضمن سوالاتم رو هم جلوی هر خط به شکل قرمز نوشتم .
با تشکر و سپاس فراوان .:لبخندساده:

stseg segment
dw 32 dup(?)
stseg ends
dtseg segment
DIGIT1 DB 3,?,3 DUP(?)
DIGIT2 DB 3,?,3 DUP(?)
operand DB 2,?,2 DUP (0)
natijeh DB '= $'
HelpInput DB '#1 op #2$'
SHOOROO db ' IN THE NAME OF GOD$'
ostad db ' Test1$'
tahi db ' Test2$'
dtseg ends

;=============================================== CALCULATOR
CDSEG SEGMENT
MAIN PROC FAR
ASSUME CS:CDSEG,SS:STSEG,DS:DTSEG
MOV AX,DTSEG
MOV DS,AX

MOV BH,07H 1-( man az inja ro nafahmidam yani chi ta
MOV CX,0000H ..........
MOV DX,184FH ..........
MOV AH,06H ..........
INT 10H inaj


MOV DH,13
MOV DL,25
CALL CURSUR
LEA DX,HelpInput
MOV AH,09H
INT 21H

MOV DH,1
MOV DL,30
CALL CURSUR
LEA DX,SHOOROO
MOV AH,09H
INT 21H

MOV DH,3
MOV DL,22
CALL CURSUR
LEA DX,ostad
MOV AH,09H
INT 21H

MOV DH,5
MOV DL,23
CALL CURSUR
LEA DX,tahi
MOV AH,09H
INT 21H

MOV DH,16
MOV DL,25
call cursur

LEA DX,DIGIT1 2- age az in ghesmat ta
MOV AH,0AH ..........
INT 21H ..........
LEA SI,DIGIT1+2 .........
CALL ASC_TO_DEC .....
MOV CX,AX inja ro ham tozih bedin mamnon misham

MOV DH,16
MOV DL,28
CALL CURSUR

LEA DX,operand
MOV AH,0AH
INT 21H

MOV DH,16
MOV DL,30
CALL CURSUR

LEA DX,DIGIT2
MOV AH,0AH
INT 21H
LEA SI,DIGIT2+2
CALL ASC_TO_DEC
XCHG AX,CX
CMP operand+2,'+'
JE ADDD
CMP operand+2,'-'
JE SUBB
CMP operand+2,'*'
JE MULL
CMP operand+2,'/'
JE DIVV
ADDD: ADD AL,CL
JMP ENDD
SUBB: SUB AL,CL
JMP ENDD
MULL: MUL CL
JMP ENDD
DIVV: DIV CL
SUB AH,AH
ENDD:

CALL natijeh_TO_ASC
MOV DH,16
MOV DL,33
CALL CURSUR
MOV AH,09H
LEA DX,natijeh
INT 21H

MOV AH,07H
INT 21H
MOV CH,16
MOV CL,22
MOV DH,17
MOV DL,46
MOV AH,06H
MOV BH,07H
INT 10H

EEE: in dastor ro ham nafahmidam yani hi ???????????
MOV AH,4CH (in 4ch ham yani chi ? che kodie?)
INT 21H ta inja

main ENDP


natijeh_TO_ASC PROC

SUB DX,DX
MOV BX,10
DIV BX
OR DL,30H
MOV natijeh[4],DL
SUB DX,DX
DIV Bx
OR DL,30H
MOV natijeh[3],DL (toye [ ] ye seri adad gozashte shode
, ina yani chi va chera toye in gozashtan ? )
SUB DX,DX
DIV Bx
OR DL,30H in 30h yani chi va che kodi ?
MOV natijeh[2],DL
OR AL,30H
MOV natijeh[1],AL
RET inam ke fekr konam shekaste barname bashe ke khodesh biad biron az barname , doroste????
natijeh_TO_ASC ENDP

ASC_TO_DEC PROC
MOV BL,10
MOV DX,WORD PTR[SI] (az inja ta akhare in dastor ro nafahmidam,
AND DX,0F0FH yani in kodhaii ke gozashte shode ro
MOV AL,DL nemidonam yani chi ? mesle :
SUB AH,AH PTR[SI] ya 0F0FH ya chera word gozashte shode?
MUL BL
ADD AL,DH
RET
ASC_TO_DEC ENDP

CURSUR PROC
MOV BH,00H in 2ta 00H va 02h che tabeii hast?
MOV AH,02H
INT 10H
RET
CURSUR ENDP

cdseg ends
end main

Metaldevil
سه شنبه 29 خرداد 1386, 19:21 عصر
سلام ID من اینه الانم انلاین هستن لطفا pm بدین تا بهتون جا هایی رو که بلدم بگم
soheil_mamdouhi2003@yahoo.com

Ghasem Dehghani
سه شنبه 29 خرداد 1386, 19:25 عصر
با سلام خدمت Metaldevil عزیز .
از توجه شما ممنونم لطفا اگه میشه تو همین تاپیک راهنمایی کنید و توضیح بدین تا هم من و هم دیگر دوستان استفاده بیشتری بکنیم . در در ضمن سوالاتم رو هم جلوی هر خط به شکل قرمز و به صورت انگلیسی نوشتم .
با تشکر .

Metaldevil
سه شنبه 29 خرداد 1386, 20:33 عصر
در مورد قسمت اول

MOV BH, 07H

رنگ صفحه رو تعیین میکنه 07 یعنی صفحه سیاه با نوشتار سفید

MOV CX, 0000H
MOV DX, 184FH

قسمتی رو که باید سیاه بشه و رنگ نوشتارش سفید بشه رو مشخص می کنه یعنی MOV CX, 0000H گوشه بالا سمت راست و MOV DX, 184FH گوشه پایین سمت راست که این دستور رو اگر به این صورت بنویسیم فهمش راحت تره

MOV ch, 00
MOV cl, 00
MOV dl, 24 ; 18Hex = 24Dec
MOV dh, 79 ;4FHex = 79Dec


MOV AH, 06H

این دستور تعداد سطر هایی رو که باید پاک بشه رو مشخص می کنه یعنی 6 سطر


MOV AH, 06H
INT 10H

و اینادستورات بالا رو به صورتی رو که گفتم اعمال میکنه یعنی اگر این دو خط نباشه کل کارایی رو که انجم دادیم بی فایده هستش

MOV BH, 07H
MOV ch, 00
MOV cl, 00
MOV dl, 24 ; 18Hex = 24Dec
MOV dh, 79 ;4FHex = 79Dec
MOV AH, 06H
INT 10H


LEA DX, DIGIT1
MOV ah , 0AH
INT 21H

این دستورات باعث چاپ مقدار DIGIT1 میشه


CALL ASC_TO_DEC
این دستور زیر روال ASC_TO_DEC رو فراخوانی می کنه که پایین تر نوشته شده

EEE
MOV ah, 4CH
INT 21H

باعث خروج از برنامه میشه یعنی هر جا که CALL EEE نوشته شده باشه این روال فراخوانی شده و از برنامه خارج مشه

30H: اگه به جدول ASCII نگاه کنی می فهمی که اعداد از 30H به بعد شروع میشه اینکار باعث ارجاع سیستم به اعداد جدول میشه یعنی اعداد رو چاپ می کنه

RET در واقع پایان یک Procedure هستش.


MOV bh, 00H

اینو میگن شماره صفحه رو مشخص میکنه ولی نمیدونم چه صفحه ای.

MOV bh, 00H
MOV ah, 02 H
INT 21H

این سه تا خط باعث پرش مکان نما به یه قسمت خاص از صفحه می شه که اون جای خاص رو مقداری رو که توی DX میریزی مشخص میکنه و این DX جایی هست که زیرش CALL CURSUR نوشته شده
بقیشم بلد نیستم ;)

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

Ghasem Dehghani
چهارشنبه 30 خرداد 1386, 18:29 عصر
با سلام و تشکر از همگی دوستان .
فقط این قسمت رو هنوز متوجه نشدم ظاهرا این قسمت برای تبدیل رشته به عددد است ولی این ضرب و جمع و تفریق های استفاده شده در این برنامه و اون قسمتی رو که جلوی کدزیر نوشتم رو هم توضیح بدین .
بازهم تشکر.

ASC_TO_DEC PROC
MOV BL,10
MOV DX,WORD PTR[SI] (az inja ta akhare in dastor ro nafahmidam,
AND DX,0F0FH yani in kodhaii ke gozashte shode ro
MOV AL,DL nemidonam yani chi ? mesle :
SUB AH,AH PTR[SI] ya 0F0FH ya chera word gozashte shode?
MUL BL
ADD AL,DH
RET
ASC_TO_DEC ENDP

Smart User
پنج شنبه 31 خرداد 1386, 09:34 صبح
سلام.
من مراحل کار رو برات توضیح میدم. خودت با دستورات چک کن

ما برای اینکه یک رشته رو به عدد تبدیل کنیم مثلا"235" که به صورت رشته ای است، باید
اول رقم "2" رو برداریم. بعد اون رو در "10" ضرب کنیم که میشه "20"
بعد باید عدد 3 رو برداریم و اون رو با مقدار قبلی جمع کنیم که میشه "23"
بعد باید عدد 23 رو در 10 ضرب کنیم که بشه 230 . و در نهایت 5 رو با اون جمع کنیم تا بشه 235.

در اینجا هم دقیقا همین مراحل انجام شده.
خط اوا ضریب 10 رو مشخص کرده.
خط دوم محتوای محلی رو که si به اون اشاره می کنه رو در dx میریزه( 2 رقم ) . البته این رو هم به یاد داشته باش که هر رقم در رشته های عددی در اسمبلی به صورت Fx ذخیره میشن . مثلا رقم "7" به صورت "F7" ذخیره میشه.
در خط سوم F رو از اول هر رقم حذف می کنه
در خط های بعد عملیات ضرب و جمع روی رقم اول و دوم طبق مراحلی که گفتم انجام میشه

موفق باشی

Younes
دوشنبه 11 تیر 1386, 13:07 عصر
با سلام
درمورد زیر برنامه ASC_TO_DEC مشخص است که یک عدد را که بصورت اسکی هست میخواهد به دسیمال تبدیل کند (کلیه اعدادی که از ورودی می گیریم بصورت اسکی هستند و ما باید آنها را به دسیمال تبدیل کنیم)
در این برنامه متغیر digit1 برای دریافت سه رقم از ورودی تعریف شده اما در این زیر برنامه یک عدد دو رقمی را تبدیل کرده که برای من جای سوال داشت . اما به هر صورت
ضمن تشکر از صرف وقت smart user باید عرض کنم که ارقام در اسمبلی بصورت Fx ذخیره نمی شوند بلکه بصورت 3x دخیره می شوند یعنی رقم 3 بصورت 33H و رقم 5 بصورت 35H و رقم صفر بصورت 30H است (کد اسکی حروف مربوطه) لذا برای تبدیل آنها به عدد باید اول یا 30H را از آنها کم کرد یا نیبل پر ارزش (4 بیت پر ارزشتر (یا 4 بیت سمت چپ بایت مورد نظر)) را صفر کرد. که این برنامه برای این کار بایت را با عدد 0FH اند (and) کرده که چهاربیت کم ارزش را حفظ کرده و چهار بیت پر ارزش را صفر می کند.
اگر ما رشته '25' را ازورودی گرفته باشیم در دستور MOV DX,WORD PTR[SI کاراکتر 2 در DL و کاراکتر 5 در DH میرود برای همین DL را در 10 ضرب کرده و با DH جمع کرده است.(البته حاصل ضرب در AX می نشیند ولی چون اینجا عدد را 2 رقمی فرض کرده لذا بجای AX از AL استفاده کرده است.

Younes
دوشنبه 11 تیر 1386, 13:41 عصر
INT 10h / AH = 2 - set cursor position.

input:
DH = row.
DL = column.
BH = page number (0..7).

example:

mov dh, 10
mov dl, 20
mov bh, 0
mov ah, 2
int 10h


در سیستم های قبلی (یعنی DOS) برای صفحه مونیتور چهار فضای مختلف که به آن صفحه یا PAGE می گفتند در نظر می گرفتند .
قبل از اینکه در مورد این صفحات توضیح بیشتربدهم باید بگویم که برای هر یک حرفی که در رو ی صفحه مونیتور نمایش داده میشود دو بایت اطلاعات در حافظه اصلی نگهداری میشود یکی کد حرفی که نوشته شده و یک بایت هم مشخصات آن که شامل رنگ قلم و رنگ زمینه و یک بیت هم برای اینکه مشخص شود آیا این حرف چشمک بزند یا نه . این فضایی که برای اطلاعات صفحه مونیتور نگهداری می شود را یک PAGE می گویند و محلش در RAM در آدرس B800:0000 است. یعنی اگر شما بطور مستقیم به این حافظه با دستور MOV هم مقدار دهی کنید اثر آنرا در روی صفحه مونیتور میتوانید ببینید(البته در حالت DOS) حال ما چهار تا از این حافظه ها داریم که PAGE های از صفر تا 3 را میسازند که پیش فرض سیستم صفحه صفر است. (هر صفحه میزان حافظه ای به اندازه 80*25*2 بایت اشغال می کند)
وقفه هایی وجود دارد که شما میتوانید صفحه پیش فرض را از صفر به یک یا دو یا سه تغییر دهید.

Smart User
چهارشنبه 13 تیر 1386, 16:28 عصر
ضمن تشکر از صرف وقت smart user باید عرض کنم که ارقام در اسمبلی بصورت Fx ذخیره نمی شوند بلکه بصورت 3x دخیره می شوند یعنی رقم 3 بصورت 33H و رقم 5 بصورت 35H و رقم صفر بصورت 30H است (کد اسکی حروف مربوطه) لذا برای تبدیل آنها به عدد باید اول یا 30H را از آنها کم کرد یا نیبل پر ارزش (4 بیت پر ارزشتر (یا 4 بیت سمت چپ بایت مورد نظر)) را صفر کرد. که این برنامه برای این کار بایت را با عدد 0FH اند (and) کرده که چهاربیت کم ارزش را حفظ کرده و چهار بیت پر ارزش را صفر می کند.

درست می گید . اعداد به صورت 3XH نوشته میشن ;)