در این قسمت یک تمرین جدید انجام داده و بوسیله آن تجربیات خودمان را افزایش
میدهیم . این تمرین اولین برنامه ما هست یک عملیات سطح پائین سیستم ، یعنی
دسترسی به دیسک ، را انجام میدهد .
تابع شماره ۲(AH=2() از وقفه ۱۳h که وقفه دیسک میباشد ، برای خواندن سکتورهای
دیسک بکار میرود . وقتی شماره هد، شیار،سکتور و … را مشخص کرده و وقفه را
فراخوانی نمودیم ، محتوای قطاع خوانده شده در محلی که با جفت ثبات ES:BX مشخص
میشود قرار میگیرد. به همین دلیل ما یک آرایه تعریف میکنیم وآدرس آن را در ES:BX
قرار میدهیم تا اطلاعات خوانده شده در آن قرار بگیرد. BUF DB 512 DUP(0)
در این مثال ما میخواهیم برنامه ای بنویسیم که محتوای قطاع بوت کننده دیسکی را
خوانده و نمایش دهد . چون میخواهیم یک سکتور را بخوانیم و اندزه هر قطاع ۵۱۲
بایت است ، پس آرایه ای با ۵۱۲ عنصر تک بایتی تعریف کرده ایم .
در قدم بعدی شماره شیار (۰-۷۹) را در CH، شماره قطاع (۱-۱۸) را در CL، شماره
درایو را در DL(…/.:0=A ) ، رویه دیسک را در DH(0=1st Side() و تعداد قطاعهائی
که باید خوانده شوند را در AL قرار میدهیم .
MOV AX/0201H
MOV CH/0 ;TRACK NUMBER
MOV CL/1 ;SECTOR NUMBER
MOV DH/0 ; SIDE #1
MOV DL/0 ; 0=A / 1=B /( …DRIVE NUMBER )
حالا باید آدرس بافر تعریف شده (BUF) را به ES:BX منتقل کنیم . گفتیم که برای
بدست آوردن شماره سگمنت هر متغیر از Seg و برای بدست آوردن مقدار آفست از Offset
استفاده میکنیم . چون برنامه ما COM. است ، پس عدد سگمنت بطور خودکار در
ثبات DS هست و احتیاجی به یافتن آن نداریم . بلکه فقط باید آن را به ES منتقل
کنیم .
گفتیم که نمیتوانیم ثبات ESو DSو را مستقیما و با MOV به هم منتقل کنیم ، بلکه
باید از یک ثبات همه منظوره مثل AX کمک بگیریم . بنا براین و برای اینکه مقدار
فعلی ثبات AX از بین نرود، ابتدا AX را در Stack قرار داده و مقدار DS را در آن
قرار میدهیم : PUSH AX ; SAVE AX
MOV AX/DS
و پس از آن محتوای AX را به ES داده و دوباره مقدار AX را از پشته POP میکنیم : MOV ES/AX
POP AX
پس از آن با دستور LEA مقدار آفست BUF را بدست می آوریم : LEA BX/BUF
و در نهایت فراخوانی اینتراپت ۱۳h. INT 13H
بقیه برنامه عبارتست از چاپ کارارکترهای داخل آرایه BUF که قبلا آن را یاد
گرفتیم . فقط به این نکته توجه میکنیم که کدهای اسکی کوچکتر از ۳۲ کدهای کنترلی
بوده و به جای آنها باید کاراکتر (.) چاپ کنیم به همین دلیل هم قطعه کدی برای آن
نوشته ایم :
MOV AL/BUF[BX]
CMP AL/32
JB SKIP
:
:
SKIP :
MOV AL/’.’
INT 10H
:
:
لیست کامل : .MODEL SMALL
.CODE
ORG 100H
START:
JMP MAIN
BUF DB 512 DUP(0)
MAIN:
MOV AX/0201H
MOV CH/0 ;TRACK NUMBER
MOV CL/1 ;SECTOR NUMBER
MOV DH/0 ; SIDE #1
MOV DL/0 ; 0=A / 1=B /( …DRIVE NUMBER)
PUSH AX ; SAVE AX
MOV AX/DS
MOV ES/AX
POP AX
LEA BX/BUF
INT 13H
MOV BX/1
MOV AH/0EH ; WRITE CHAR.
PRINT:
MOV AL/BUF[BX]
CMP AL/32
JB SKIP
INT 10H
JMP CONT
SKIP:
MOV AL/’.’
INT 10H
CONT:
INC BX
CMP BX/513
JNZ PRINT
INT 20H
END START
دیدگاه خود را بیان کنید.
باید وارد سایت شده باشید برای دیدگاه دادن