به نام خداوند بخشنده و مهربان!

سلام خدمت دوستان و هموطنان عزیز!

از این رو که من نمیتونم یه چیزی یاد بگیریم و بدون اینکه اونو آموزش بدم ازش بگذرم، اومدم تا آموزش نمایش یک جمله یا رشته رو توی زبان اسمبلی رو آموزش بدم!

خوب برنامه emu8086 رو باز کنید تا آماده باشه!

بریم سراغ توضیحات و آموزش

نمایش یک کاراکتر روی صفحه نمایش

خوب برای این کار از اینتراپت (وقفه ی) 10h استفاده میکنیم! چون کار این تابع ورودی - خروجی صفحه نمایش هست! این وقفه توابع زیادی داره ( 16 تا ) که ما به تابع 14 هم که همون E تو اعداد هگز میشه نیاز داریم! پس باید رجیستر های زیر رو برای نمایش یک کاراکتر تنظیم کنید!

AH : عدد هگز 0X0E

AL : کاراکتر مورد نظر

BL : رنگ زمینه

BH : صفحه حافظه نمایش

خوب ما فعلا با دوتا آخریه کار نداریم! s07 بنابراین اگه بخوایم از دو تا اولیه استفاده کنیم میتونیم کد زیر رو بنویسیم که کاراکتر A رو نمایش میده!

print:
mov al,'A'
mov ah,0xE
int 10

خوب، دیدید که نشون دادن یه کاراکتر کار چندان سختی هم نبود s10

نمایش یک رشته روی صفحه

برای نمایش یک رشته روی صفحه باید تک تک کاراکتر های رشته رو توی ثبات (رجیستر) al قرار بدیم! مثلا میتونیم یه حلقه درست کنیم تا این کار رو برامون بکنه! ولی کمی سخت میشه s03

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

msg db "Ya Hossein...!",0
print:
lodsb    ;mov al,char
mov ah,0xE
int 10
jmp print

 

راستش شاید بگید که 0 دیگه چیه آخر اون msg؟ باید بگم اگه ما داریم با دستور jmp حلقه رو تکرار میکنیم بنابراین تعداد خاصی برای تکرار حلقه در نظر نگرفتیم و اگه بخواد بی نهایت تکرار بشه که همه خونه های حافظه رو نمایش میده s01 بنابراین باید یه کاری کنیم که اگه به 0 برسه نمایش رشته تموم بشه! بنابراین باید از یه شرط استفاده کنیم تا ببینیم آیا رشته تموم شده یا نه! بنابراین میایم و کد زیر رو به کد بالا اضافه کنیم!

or al,al
jz end_print

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

بنابراین کد کل به صورت زیر میشه:

msg db "Ya Hossein...!",0
print:
or ah,ah
jz end_print
lodsb 
mov ah,0xE
int 10
jmp print
end_print:
ret

خوب کار تموم شد! امدوارم مفید بوده باشه!

فعلا...

یا علی مدد...!