( تعداد نمایش : 2120 )

اسمبلی یاد بگیریم – ۱۵

در قسمت قبلی چند عملگر بیتی را دیدیم . در این قسمت هم این مبحص را دنبال
میکنیم .
عملگر Not : عملوند Not ارزش همه بیتهای یک بایت یا کلمه را برعکس میکند .
یعنی تمام بیتهای ۱را ۰ا و تمام بیتهای ۰را ۱ا میکند . بعنوان مثال اگر AH حاوی
مقدار ۱۰۱۰۱۱۰۱ باشد، بعد از اجرای Not Al ، محتوای AL بصورت ۰۱۰۱۰۰۱۰ خواهد
بود.

جدول ارزشی Not Not X X N
F | T
T | F

عملگر Neg . این اپراتور معمولا با Not اشتباه میشود در صورتی که کمتر شباهتی بین
آنها وجود دارد . Neg ارزش عددی یک عدد علامتدار را برعکس میکند . یعنی یک عدد
منفی را مثبت میکند و برعکس . در اعداد علامتدار ( همانطور که بعدا هم خواهیم
دید )، اولین بیت سمت چپ ( بیت هشتم ) بیت علامت است . ۱ بودن آن نشاندهنده
منفی بودن و ۰ بودن آن نشان دهنده مثبت بودن است .
عملگر Neg با عکس کردن بیت علامت ، ارزش عدد را عکس میکند .
این عملوند را در مبحث اعداد علامتدار مفصلا میخوانیم .
مثال : میخواهیم برنامه ای بنویسیم که تمام حروف کوچک یک عبارت را به حروف
بزرگ تبدیل کند . از نظر مقدار عددی ، تفاوت حروف کوچک و بزرگ در اینست که
بیت پنجم در حروف بزرگ برابر ۰ و در حروف کوچک ۱ است . مثلا کداسکی حرف a
به باینری برابر ۰۱۱۰۰۰۰۱ و کد A برابر ۰۱۰۰۰۰۰۱ است . پس برنامه ای مینویسیم
که تمام کاراکترهای رشته کاراکتری مورد نظر را خوانده و بیت پنچم آنها را ۰ کند
. در قسمت قبلی دیدیم که برای ۰ کردن یک بیت ، یک عدد باینری که تمام بیتهای
آن ۱ ، و بیت مورد نظر (برای ۰ کردن ) ۰ باشد را با عدد مورد نظر AND میکنیم .

. MODEL SMALL
. CODE
ORG 100H
START :
JMP MAIN
MSG DB ‘ this is an example/ ..$’
MAIN :

بدست آوردن آدرس رشته ; LEA BX/MSG LOOP :_

قرار دادن کارکتر در AL ; MOV AL/[BX]
آیا کاراکتر $ است ? ; CMP AL/’$’
بله ، به MAIN برو ; _JZ END
بیت پنجم را صفر کن ; AND [BX]/11011111B
یکواحد به BX اضافه کن – کاراکتر بعدی ; INC BX JMP LOOP _;
END :_

قرار دادن آفست رشته در DX ; MOV DX/BX
تابع ۹ برای نمایش رشته ; MOV AH/9
قفه ۲۱h ; INT 21H
پایان برنامه ; INT 20H END START

معمولا برنامه هائی که پیغامهای خود را کد میکنند ( مثل ویروسها ) از این روش یا
روشی مشابه برای Decode کردن پیغامها استفاده میکنند .

مثال :
بایت وضعیت صفحه کلید که مربوط به وضعیت کلید های کنترلی CapsLock/NumLock
در بایوس های AT/PS2 در آدرس ۰۰۱۷h:0040h قرار دارد.
بیتهای این بایت نشان میدهد که کدام کلید فعال است . ۱ بودن به معنی روشن بودن
و ۰ به معنی خاموش بودن آن است . در مثال زیر بیت ششم برای کلید CapsLockرا ۱ا
میکنیم تا Capslock روشن شود .
.MODEL SMALL
.CODE
ORG 100h
START:
PUSH ES
MOV AX/0040h
MOV ES/AX
MOV AL/ES:[17h]
OR AL/32
MOV BYTE PTR ES:[17h]/AL
POP ES
MOV AH/1
INT

دیدگاه خود را بیان کنید.

باید وارد سایت شده باشید برای دیدگاه دادن