2015/08/01

أكواد أسمبلي 16 بت لـلمبرمج Z3r0n3

السلام عليكم
سأضع في هذه الصفحة أكواداً قام الأخ Z3r0n3 بنشرها (وبفضله دخلت إلى لغة أسمبلي ولم أستطع الخروج :)
الأكواد منظمة بحيث يوضع الشرح ثم الكود. =============================================
هدا كودي اللأول للبرنامج الشهير Hello World

.model small
.stack 100h

.data
msg db "Hello World!",10,13,"$"

.code
start:

mov ax,@data
mov ds,ax

mov dx,offset msg
mov ah,9
int 21

mov ax,0c07h
int 21

end start
 ================================================================
هدا نفس البرنامج Hello World لكن استعملت في مكان التعليمة mov (التي نضع 
بها محتوى المتغير msg في dx) بتعليمة أخرى وهي lea و حدفت كلمة offset قبل
 اسم المتغير
كود البرنامج:
.model small
.stack 100h

.data ;قسم البيانات
msg db "Hello World!",10,13,"$" 

.code ; قسم الكود
start: ; بداية الكود

mov ax,@data ; نضع مقطع البيانلت في المسجل ax
mov ds,ax ; نضع قيمة ax في ds (data segment)

lea dx,msg ; كما قلت استعملت lea لوضع قيمة msg في dx و حدفت كلمة offset
mov ah,9 ; اجراءات اضهار نص في الشاشة
int 21 ; تنفيد الأمر

mov ax,0c07h ; هنا يقوم البرنامج بإنتضار زر مدخل ثم يقفل البرنامج
int 21 ; تنفيد الأمر

end start ; نهاية الكود
=================================================================
لكن في هذا المثال سأقوم بتكبير حجم شاشة البرنامج  Hello World هذا الكود الثالث و هو نفس البرنامج
و إظهار الرسالة, كذلك سنتعرف على كيفية كتابة الرسالة على أكثر من سطر
: الكود  
; ArabTeam2000
; Program CodedBy Z3r0n3
.model small
.stack 100h
 
.data ; قسم البيانات
msg     db "--------------------",10,13 ; لاحظ أن المتغير إنتهى ب 10,13 وهي تعني الرجوع الى السطر  
            db "| Hello World!",10,13 ; عندها يرجع الى السطر و يكتب محتوى هذا ثم يقوم بالرجوع الى السطر
            db "| CodedBy Z3r0n3 ",10,13 ; نفس الشيئ
            db "| ArabTeam2000",10,13 ; نفس الشيئ
            db "--------------------","$" ; لاحظ هنا أنه انتهى بـ "$" وهي تعني نهاية المتغير

.code ; قسم الكود
start: ; بداية الكود
                        mov ax,@data ;ax نضع قسم البيانات في
                        mov ds,ax ; (data segment) ds في ax نضع قيمة
                        mov ax,13h ; (Full Screen)هنا سنقوم بتغيير شاشة البرنامج على حجم الشاشة
                        int 10h ; تنفيذ الأمر
                        mov dx,offset msg ; dx في msg نضع قيمة
                        mov ah,9 ;\  إضهار
                        int 21h  ;/ الرسالة
                        mov ah,7 ; يقوم بانتضار زر مدخل
                        int 21h ; تنفيذ أمر
                        mov ax,4c00h ; (Inactif) هنا يقوم بإيقاف تشغيل البرنامج لاحظ ان شاشة البرنامج سيكتب فيها 
                        int 21h ; تنفيذ أمر
end start ; نهاية الكود
=============================================================== 
فكرة عن البرنامج : البرنامج سيسألك 4 أسئلة و أنتم ستجيبون عنها
طبعا الفائدة لن تكون في الإجابة عن الأسئلة بل ستكون في معرفة كيف برمج و ماهو الجديد في البرنامج و ماذا سأستفيد من البرنامج
في هذا البرنامج استعملت شيئ جديد و هو ال Procedure
; ArabTeam2000
; Program CodedBy Z3r0n3
.model small
.stack 100h

.data ; قسم البيانات
question1 db "Whats your name? : ","$"
question2 db 10,13,"Where are you from ? : ","$"             ;\         
question3 db 10,13,"How old are you ? : ","$"                ;|  لاحظ أن المتغيرات تبدأ بـ 10,13 لكي يكتب النص في سطر جديد
question4 db 10,13,"Do you like Assembly (Y/N) ? : ","$"     ;/

.code ; قسم الكود
start: ; بداية الكود
mov ax,@data              ; ax نضع قسم البيانات في
mov ds,ax                     ; (data segment) ds في ax نضع قيمة
mov dx,offset question1 ; \ dx نضع محتوى المتغير في المسجل
call write                       ; /     كتابة نص procedure نطلب
call read                       ; قرائة نص procedure نطلب
call waiter                     ; تنتظر الضغط على أي زر procedure نطلب
mov dx,offset question2 ; \ dx نضع محتوى المتغير في المسجل 
call write                       ; / كتابة نص procedure نطلب
call read                       ; قرائة نص procedure نطلب
call waiter                     ; تنتظر الضغط على أي زر procedure نطلب
mov dx,offset question3 ; \ dx نضع محتوى المتغير في المسجل
call write                       ; / كتابة نص procedure نطلب
call read                       ; قرائة نص procedure نطلب
call waiter                     ; تنتظر الضغط على أي زر procedure نطلب
mov dx,offset question4 ; \  نضع محتوى المتغير في المسجل dx
call write              ;  /procedure  كتابة نص  نطلب 
call read                       ; قرائة نص procedure نطلب
call Exit                        ; إيقاف البرنامج procedure نطلب

write proc                                                         ; كتابة نص procedure بداية
mov ah,9                                  ; الرقم 9 هو رقم الخاص بكتابة نص على الشاشة
int 21h                                      ; تنفيذ الأمر السابق
Ret                                                       ; الرجوع للأمر الذي يلي طلب تنفيذ هذه الدالة
write endp                                                        ; كتابة نص procedure نهاية                                             

waiter proc                                                       ; إنتظار الضغط على الزر procedure بداية
mov ah,7                                  ; الرقم 7 هو رقم الخاص بانتظار ادخال زر
int 21h                                      ; تنفيذ الأمر السابق
Ret                                                       ; الرجوع للأمر الذي يلي طلب تنفيذ هذه الدالة
waiter endp                                                      ; إنتظار الضغط على الزر procedure نهاية

read proc                                                         ; قرائة نص  بداية procedure
mov ah,0ah                               ; رقم خاص بقرائة نص : ha0
int 21h                                      ; تنفيذ الأمر السابق
Ret                                                       ; الرجوع للأمر الذي يلي طلب تنفيذ هذه الدالة
read endp                                                         ; قرائة نص procedure نهاية

Exit proc                                                          ; إيقاف البرنامج procedure بداية
mov ax,4c00h                           ; هذا الرقم خاص بإقاف البرنامج و غالبا ما ستجده في البرامج الأخرى
int 21h                                      ; تنفيذ الأمر السابق
Ret                                                       ; الرجوع للأمر الذي يلي طلب تنفيذ هذه الدالة
Exit endp                                                          ; إيقاف البرنامج procedure نهاية
end start                                                           ; و أخيرا نهاية الكود
========================================================
نهاية أكواد Z3r0n3 
الرابط الأصلي

ليست هناك تعليقات:

إرسال تعليق