saalek
مدیر بازنشسته
حال مي خواهيم برنامه اي بنويسيم كه يك رجيستر (مثلا در اينجا bh ) را چاپ كنيم.
اولا بگم كه كار اين برنامه اينه كه هر چي در bh گذاشته بوديم(خط آبي) را چاپ مي كنه. كه با اين كد 7c چاپ ميشه.
دوما چرا به رنگ آبي نشان دادم. چون خطي است كه داره مقدار دهي مي كنه به bh و ميشه بجاش يك رجيستر ديگه را در bh قرار داد. مثلا mov bh,cl و اين جوري cl و به همين ترتيب همه رجيسترها را ميشه چاپ كرد.
سوما نحوه ((كامنت نويسي)) را مي بينيد كه بعد ((سمي كالن ; )) شما هر توضيحي آزاديد كه بنويسيد تا باعث راهنمايي خودتان و ديگر برنامه نويسان بشه.
چهارما بيشتر پستهاي اين تاپيك را من نوشتم تا اين برنامه را بتوانم شرح بدهم. اين برنامه از كتاب پيترنورتون است كه به فارسي ترجمه شده. فكر كنم اكثرا با كتاب سيد رضي كار مي كنند. اين كتاب يك اسمبلي پيشرفته هم داره كه براي ويندوزه و آن را هم من دارم ولي هنوز فرصت نشده با كدهاش تمرين كنم.
پنجما چيزي كه در اين برنامه اصل است همان اضافه كردن 30 در مبناي 16 به عدد است و اگر a يا بعدش بود ( تا f ) باز اضافه كردن 7 در مبناي 16 تا آن عددي كه مي خواهيم بدست بياد كه در چند پست قبل شرح داديم چرا 30 و 7 .
البته مي بينيد كه بعد 7 ، من حرف h كه به معني هگزائي(مبناي 16 ) است را نگذاشته ام چون مي دانيد كه زير 10 مبناي 10 و 16 يكي است.
من يك اشتباهي كردم بعد 4c حرف h را نگذاشتم كه خطا گرفت . چون در مبناي 10 ديگر 4c معنا نداره. كه با گذاشتن حرف h متوجه شد كه مبناي 16 است. يكبار هم حرف h را با فاصله گذاشتم كه فكر كنم باعث خطا ميشه. البته با كامپايلر من يعني tasm . من با masm قبلا كمي كار كردم ولي خيلي خطا مي گرفت كنار گذاشتمش.
ششم شرح چگونگي جدا كردن 7 و c از هم.
باز در پستهاي قبلي اين را به طور مشروح گفتيم ولي باز به طور خلاصه بگيم كه در part اول برنامه ، يعني قبل اولين احضار dl_print آمده ايم 4 بار به راست شيفت داده بوديم. در اين كتاب آمده بود در 4 را در cl گذاشته بود و بعد به اندازه cl شيفت داده بود. ولي من ضرورت اين كار را نفهميدم و حذفش كردم.
اين را هم بگم كه در محيط ديباگ من مجبور شدم 4 بار تك شيفت بدهم و در آنجا فكر كنم نميشه يكباره 4 تا را با هم شيفت داد.
كلا در اين قضيه كه تك تك شيفت بدهيم يا به يكباره فكر كنم بين كامپايلرهاي مختلف ، تفاوتهايي موجود است.
در part دوم يعني قبل احضار دوم dl_print با استفاده از دستور and آمده تكه بالايي را پوشانده و تكه با ارزش كمتر را با f كردن اجازه عبور داده. منظورم 0f است كه در خط 11 روي dl تاثير داده شده.
در هر دو part همان قضيه اضافه كردن 30 و 7 مشاهده ميشه.
البته من يك تغيير ديگر هم در برنامه دادم. دو دستور mov ah,02 و int 21h را كتاب در دو part ، تكرار كرده بود و من با استفاده از زير برنامه هر دو قسمت را خارج كردم و به جاش احضار dl_print را قرار دادم.
نكته هفتم و آخر هم راجع به jl است.
بهتره بدانيد كه همه اسمهاي اين پرشهاي شرطي به خاطر كارشان است.
در اينجا jump if less than است. و مي بينيد كه به كار برنامه ما مياد.
كلا اين جوري بهتر و راحت تر ميشه يادمان بماند اين دستور پرش شرطي چه زماني پرش مي كند ولي اگر بخواهيم با فلاگها بيان كنيم، وقتي پرش مي كند كه (( فلاگ علامت )) و (( فلاگ سر ريز)) با هم برابر نباشند.
حالا less than را ربط بدهيد به اين دو فلاگ.
.
کد:
.model small
.stack
.code
[color=red]bh_printer proc[/color]
[color=blue]mov bh,7ch[/color] ; (1) meghdar avalieh be (bh)
mov dl,bh ; (2) enteghale (bh) be (dl)
shr dl,4 ; (3) 4 bar shifte (dl)
add dl,30h ; (4)
cmp dl,3ah ; (5)
jl lable_1 ; (6)
add dl,7 ; (7)
lable_1: ; (8)
call dl_print ;(9)
mov dl,bh ; (10)
and dl,0fh ; (11)
add dl,30h ; (12)
cmp dl,3ah ; (13)
jl lable_2 ; (14)
add dl,7 ; (15)
lable_2: ; (16)
call dl_print ; (17)
mov ah,4ch
int 21h
[color=red]bh_printer endp[/color]
[color=red]dl_print proc[/color]
push ax
mov ah,2h
int 21h
pop ax
ret
[color=red]dl_print endp[/color]
end [color=red]bh_printer[/color]
اولا بگم كه كار اين برنامه اينه كه هر چي در bh گذاشته بوديم(خط آبي) را چاپ مي كنه. كه با اين كد 7c چاپ ميشه.
دوما چرا به رنگ آبي نشان دادم. چون خطي است كه داره مقدار دهي مي كنه به bh و ميشه بجاش يك رجيستر ديگه را در bh قرار داد. مثلا mov bh,cl و اين جوري cl و به همين ترتيب همه رجيسترها را ميشه چاپ كرد.
سوما نحوه ((كامنت نويسي)) را مي بينيد كه بعد ((سمي كالن ; )) شما هر توضيحي آزاديد كه بنويسيد تا باعث راهنمايي خودتان و ديگر برنامه نويسان بشه.
چهارما بيشتر پستهاي اين تاپيك را من نوشتم تا اين برنامه را بتوانم شرح بدهم. اين برنامه از كتاب پيترنورتون است كه به فارسي ترجمه شده. فكر كنم اكثرا با كتاب سيد رضي كار مي كنند. اين كتاب يك اسمبلي پيشرفته هم داره كه براي ويندوزه و آن را هم من دارم ولي هنوز فرصت نشده با كدهاش تمرين كنم.
پنجما چيزي كه در اين برنامه اصل است همان اضافه كردن 30 در مبناي 16 به عدد است و اگر a يا بعدش بود ( تا f ) باز اضافه كردن 7 در مبناي 16 تا آن عددي كه مي خواهيم بدست بياد كه در چند پست قبل شرح داديم چرا 30 و 7 .
البته مي بينيد كه بعد 7 ، من حرف h كه به معني هگزائي(مبناي 16 ) است را نگذاشته ام چون مي دانيد كه زير 10 مبناي 10 و 16 يكي است.
من يك اشتباهي كردم بعد 4c حرف h را نگذاشتم كه خطا گرفت . چون در مبناي 10 ديگر 4c معنا نداره. كه با گذاشتن حرف h متوجه شد كه مبناي 16 است. يكبار هم حرف h را با فاصله گذاشتم كه فكر كنم باعث خطا ميشه. البته با كامپايلر من يعني tasm . من با masm قبلا كمي كار كردم ولي خيلي خطا مي گرفت كنار گذاشتمش.
ششم شرح چگونگي جدا كردن 7 و c از هم.
باز در پستهاي قبلي اين را به طور مشروح گفتيم ولي باز به طور خلاصه بگيم كه در part اول برنامه ، يعني قبل اولين احضار dl_print آمده ايم 4 بار به راست شيفت داده بوديم. در اين كتاب آمده بود در 4 را در cl گذاشته بود و بعد به اندازه cl شيفت داده بود. ولي من ضرورت اين كار را نفهميدم و حذفش كردم.
اين را هم بگم كه در محيط ديباگ من مجبور شدم 4 بار تك شيفت بدهم و در آنجا فكر كنم نميشه يكباره 4 تا را با هم شيفت داد.
كلا در اين قضيه كه تك تك شيفت بدهيم يا به يكباره فكر كنم بين كامپايلرهاي مختلف ، تفاوتهايي موجود است.
در part دوم يعني قبل احضار دوم dl_print با استفاده از دستور and آمده تكه بالايي را پوشانده و تكه با ارزش كمتر را با f كردن اجازه عبور داده. منظورم 0f است كه در خط 11 روي dl تاثير داده شده.
در هر دو part همان قضيه اضافه كردن 30 و 7 مشاهده ميشه.
البته من يك تغيير ديگر هم در برنامه دادم. دو دستور mov ah,02 و int 21h را كتاب در دو part ، تكرار كرده بود و من با استفاده از زير برنامه هر دو قسمت را خارج كردم و به جاش احضار dl_print را قرار دادم.
نكته هفتم و آخر هم راجع به jl است.
بهتره بدانيد كه همه اسمهاي اين پرشهاي شرطي به خاطر كارشان است.
در اينجا jump if less than است. و مي بينيد كه به كار برنامه ما مياد.
كلا اين جوري بهتر و راحت تر ميشه يادمان بماند اين دستور پرش شرطي چه زماني پرش مي كند ولي اگر بخواهيم با فلاگها بيان كنيم، وقتي پرش مي كند كه (( فلاگ علامت )) و (( فلاگ سر ريز)) با هم برابر نباشند.
حالا less than را ربط بدهيد به اين دو فلاگ.
.