آموزش مصور اسمبلر. دستورالعمل های حسابی مونتاژ

تیم ADC(افزودن با حمل) متعلق به گروه است دستورات عدد صحیح(یا دودویی)حسابی (دستورالعمل های حساب باینری) و جمع صحیح دو عملوند علامت دار یا بدون علامت را انجام می دهد ( DESTو SRC) و حمل پرچم EFLAGS.CF . عملوند اول ( عملوند مقصد, DEST) می تواند یک متغیر در یک ثبات یا در حافظه باشد ( , r16, r32 , r/m8, r/m16, r/m32). عملوند دوم ( عملوند منبع, SRC) - معنی فوری ( imm8, imm16, imm32) یک متغیر در یک ثبات یا در حافظه است. در این حالت، هر دو عملوند نمی توانند به طور همزمان متغیرهایی در حافظه باشند.

نتیجه جمع با دستور ADCبه جای عملوند اول قرار می گیرد ( DEST). پرچم ها در رجیستر EFLAGS بر اساس نتیجه تنظیم می شوند.

هنگام افزودن یک مقدار مستقیم imm8یا imm16با یک عملوند دو بایتی یا چهار بایتی، مقدار فوری ابتدا با علامت به اندازه عملوند اول گسترش می یابد و تنها پس از آن جمع انجام می شود.

تیم ADCمعمولاً در چند بایت یا چند کلمه ( چند کلمه ای) عملیات اضافه در این مورد، از دستورالعمل ADD پیروی می کند، که مجموع بیت های مرتبه پایین عملوندهای چند بایتی (چند کلمه ای) را برمی گرداند، و اجازه می دهد تا هنگام اضافه کردن بیت های مرتبه بالا، حمل و نقل در نظر گرفته شود. مثلا:

mov edx, 0 ; EDX = 0
mov eax, 0FFFFFFFFh ; اولین افزونه 32 بیتی در EAX قرار می گیرد
اضافه کردن eax، 0FFFFFFFFh ; افزودن دوم 32 بیتی - 0x FFFFFFFFh، دو عملوند 32 بیتی اضافه می کنیم
adc edx, 0 ; EDX = EDX + CF، حمل و نقل را در نظر بگیرید
; EDX:EAX = 0000000lh:FFFFFFFEh - نتیجه 64 بیتی حاصل

تیم ADCاجازه می دهد تا عملوندهای اعداد صحیح را مانند در دستکاری کنید فرمت بدون امضا، و در فرمت امضا شده. هنگام اضافه کردن داده ها با علامت علامت پرچم EFLAGS.SF نشانه نتیجه به دست آمده را منعکس می کند. پرچم سرریز EFLAGS.OF روی 1 تنظیم می شود اگر هنگام افزودن مقادیر صحیح علامت دار که در مکمل دو یا مکمل دو نشان داده می شوند، سرریزی رخ دهد (که از مهم ترین بیتی که بیت قبل از بیت علامت مطابقت دارد) رخ دهد. نتیجه حاصل از اندازه موجود عملوند -انتصاب ها بیشتر است ( DEST). اساساً، این شبیه به نحوه نمایش پرچم EFLAGS.CF سرریز (حمل) هنگام اضافه کردن است. عملوندهای بدون علامت. به عنوان مثال، هنگام اضافه کردن دو مقدار 32 بیتی که در کد معکوس نشان داده شده اند، ممکن است به شکل زیر باشد:

mov eax, operand1 ; EAX = operand1، اولین افزونه 32 بیتی در EAX قرار می گیرد
eax, operand2 را اضافه کنید. دو عملوند 32 بیتی را در کد معکوس اضافه می کنیم
به ؛ پرش به وقفه کنترل کننده در صورت سرریز

adc eax, 0 ; EAX = EAX + CF، حمل را در نظر بگیرید (برای اضافه کردن در کد معکوس ضروری است)
; EAX = operand1 + operand2 - نتیجه جمع در کد معکوس
jns m1; انتقال اگر نتیجه مثبت باشد
xor eax, 7FFFFFFFFh ; تبدیل مقدار منفی در EAX به کد مستقیم
m1: EAX - نتیجه اضافه کردن در کد مستقیم

پرچم کمکی(یا اضافی)انتقال EFLAGS.AF به دستکاری داده ها در قالب BCD کمک می کند ( فرمت BCD بسته بندی شده). در صورتی تنظیم می شود که در حین جمع، انتقالی از تتراد پایین به تتراد زیاد بایت کم نتیجه اتفاق بیفتد. با استفاده از دستور DAA بلافاصله بعد از دستور ADC، امکان تولید به اصطلاح وجود دارد تصحیح اعشاریحاصل جمع و بدست آوردن مجموع در همان فرمت BCD بسته بندی شدهمانند اصطلاحات اصلی.

تیم ADCبا عملوند مقصد ( DEST) که یک متغیر حافظه است، می تواند همراه با پیشوند قفل LOCK استفاده شود که اجرای اتمی فرمان را تضمین می کند.

دستورات اضافه - ADD، ADC

دستورالعمل های ADD (افزودن) و ADC (افزودن با حمل) می توانند هر دو عملوند 8 و 16 بیتی را اضافه کنند.

دستور ADD محتویات عملوند مبدا و عملوند مقصد را اضافه می کند و نتیجه را در عملوند مقصد قرار می دهد.

فرمت فرمان: ADD گیرنده، منبع

در نماد نمادین، اعمال آن را می توان اینگونه توصیف کرد: سینک:= سینک + منبع (مجموع محتویات سینک و منبع در سینک نوشته می شود).

دستور ADC همان دستور ADD را انجام می دهد، اما نه دو، بلکه سه عبارت را اضافه می کند: مقصد، مبدا و پرچم حمل.

فرمت فرمان: گیرنده ADC، منبع + CF

در نماد نمادین، اقدامات آن را می توان به صورت زیر توصیف کرد:

سینک:= سینک + منبع + محتویات پرچم حمل.

حمل هنگام اضافه کردن اعداد باینری شبیه به حمل اعداد اعشاری در یک ستون است. هنگامی که کامپیوتر اعداد باینری را اضافه می کند و مجموع آن در عملوند مقصد قرار نمی گیرد، یک انتقال تولید می شود. همانطور که می دانید، یک ثبات 8 بیتی می تواند مقادیر بدون علامت را در محدوده 0 تا 255 نگه دارد. اگر برای مثال، جمع دودویی اعداد 250 و 10 را انجام دهیم، نتیجه زیر را خواهیم داشت:

1111 1010; نمایش دودویی عدد 250.

0000 1010 ; نمایش دودویی عدد 10.

1 0000 0100; نمایش باینری مجموع برابر با 260.

نتیجه درست است، اما 9 بیت باینری را اشغال می کند. اگر از رجیسترهای 8 بیتی استفاده شده باشد، 8 بیت پایینی به رجیستر مقصد و بیت نهم در پرچم حمل CF وارد می شود.

اکنون می دانیم که چرا ریزپردازنده 8086 دو دستورالعمل اضافه متفاوت دارد. یکی از آنها (ADD) می تواند مقادیری را که با بایت ها یا کلمات نشان داده شده اند و همچنین قسمت های پایین تر مقادیر با دقت بالا را اضافه کند. دستورالعمل دیگری (ADC) برای اضافه کردن مقادیر با دقت بالا استفاده می شود.

عملوندهایی که باید اضافه شوند می توانند در حافظه، یک ثبات یا دارای یک مقدار فوری باشند. مثلا:

ADD AX,MEM_WORD. محتویات یک سلول حافظه را به یک ثبات اضافه کنید،

MEM_WORD،AX را اضافه کنید. یا برعکس، محتویات رجیستر را به سلول حافظه اضافه کنید.

ADD AL, 10; یک ثابت به محتویات رجیستر اضافه کنید.

MEM_BYTE، 8H را اضافه کنید. ثابت و محتویات سلول حافظه را اضافه کنید.

اکثر ترکیبات ممکن مجاز هستند، اما ممنوع استمحتویات دو سلول حافظه را اضافه کنید یا از یک مقدار مستقیم (عدد) به عنوان گیرنده استفاده کنید.

دستورات ADD و ADC می توانند بر شش پرچم زیر تأثیر بگذارند:

حمل پرچماگر نتیجه جمع در عملوند مقصد قرار نگیرد، CF 1 است، در غیر این صورت 0 است.

پرچم برابریاگر نتیجه دارای تعداد بیت زوج با مقدار 1 باشد، PF 1 است، در غیر این صورت 0 است.

اگر نتیجه جمع کردن اعداد اعشاری نیاز به اصلاح داشته باشد، AF برابر با 1 است.

پرچم صفراگر نتیجه 0 باشد، ZF 1 است.

علامت پرچماگر نتیجه منفی باشد SF 1 است (مهمترین بیت 1 است)، در غیر این صورت 0 است.

پرچم سرریزاگر مجموع دو عدد از یک علامت از محدوده مقادیر قابل قبول گیرنده در کد معکوس فراتر رود و خود گیرنده علامت را تغییر دهد، OF برابر با 1 است. در غیر این صورت، پرچم OF 0 است.

دستور افزایش یک مقدار گیرنده - INC

تیم INC(افزایش) 1 را به محتویات یک ثبات یا سلول حافظه اضافه می کند، اما برخلاف دستورالعمل ADD، بر CF پرچم حمل تأثیر نمی گذارد. فرمت فرمان: گیرنده INC.

دستور INC برای افزایش شمارنده در حلقه های دستورالعمل مفید است. همچنین می توان از آن برای افزایش مقدار ثبات شاخص هنگام دسترسی به سلول های حافظه متوالی استفاده کرد. عملوند به عنوان یک عدد بدون علامت تفسیر می شود.

مثلا:

INC CX; افزایش مقدار 16 بیتی

INC AL; یا رجیستر 8 بیتی در هر واحد.

INC MEM_BYTE; افزایش مقدار بایت

INC MEM_WORD; یا کلمات حافظه در واحد.

استفاده از مقدار فوری به عنوان عملوند مجاز نیست.

دستورات تفریق - SUB، و تفریق با قرض گرفتن SBB

تیم ها زیر( تفریق - تفریق ) و SBB(تفریق با قرض) به ترتیب مشابه دستورهای جمع ADD و ADC هستند، فقط هنگام تفریق، پرچم حمل CF به عنوان نشانه ای از وام عمل می کند. فرمت فرمان: گیرنده SUB، منبع;

دستور SUB عملوند مبدا را از عملوند مقصد کم می کند و نتیجه را به صورت نمادین در مقصد قرار می دهد:

سینک:= سینک – منبع.

تیم SBBهمین کار را انجام می دهد، اما علاوه بر این مقدار پرچم حمل CF را از گیرنده کم می کند:

گیرنده SUB، منبع – CF;

مقصد:= سینک - منبع - محتویات پرچم حمل.

همانند موارد اضافی، دستورالعمل های SUB و SBB دو عملکرد جداگانه را انجام می دهند. دستور اول اعداد با بایت یا کلمه و همچنین بیت های مرتبه پایین اعداد با دقت بالا را کم می کند (قسمت مرتبه پایین عدد در ثبات AX قرار دارد و قسمت مرتبه بالا در رجیستر AX قرار دارد. ثبت DX). فرمان دوم مهم ترین بیت های اعداد با دقت بالا را کم می کند. به عنوان مثال، دستور SUB AX,CX; محتویات رجیستر CX را از محتویات رجیستر AX کم می کند و نتیجه را به رجیستر AX برمی گرداند.

اگر اندازه عملوند بیش از 16 بیت باشد، باید از دستورات زیر استفاده کرد:

SUB AX,CX; 16 بیت کم را کم کنید.

SBB BX,DX; و سپس مهم ترین 16 بیت.

در اینجا ما از عدد 32 بیتی قرار داده شده در رجیسترهای AX و BX عدد 32 بیتی موجود در رجیسترهای CX و DX را کم می کنیم. هنگام تفریق محتویات رجیستر DX از محتویات رجیستر BX، دستور SBB امکان قرض گرفتن را هنگام انجام اولین تفریق در نظر می گیرد.

SUB AX، MEM; محتویات یک سلول حافظه را از یک ثبات کم کنید.

SUB MEM، AX; یک رجیستر را از یک سلول حافظه کم کنید.

SUB AL,1O; یک ثابت را از یک ثبات کم کنید.

SUB MEM_BYTE، OFh؛ یک عدد ثابت را از یک سلول حافظه کم کنید.

نمی توان مستقیماً تفریق کردمحتویات یک سلول حافظه از سلول دیگر، یا از مقدار فوری به عنوان مقصد استفاده کنید.

دستورات SUB و SBB می توانند شش پرچم را به شرح زیر تحت تأثیر قرار دهند:

· نصب حمل پرچم CF در صورت نیاز به وام 1 است، در غیر این صورت 0 است.

· نصب پرچم برابری PF 1 است اگر نتیجه تفریق دارای تعداد بیت زوج با مقدار 1 باشد، در غیر این صورت 0 است.

· نصب پرچم حمل کمکیاگر نتیجه تفریق اعشاری نیاز به اصلاح داشته باشد، AF 1 است، در غیر این صورت 0 است.

· نصب پرچم صفر ZF به 1 اگر نتیجه 0 باشد، در غیر این صورت 0 است.

· نصب علامت پرچماگر نتیجه منفی باشد SF 1 است (مهمترین بیت 1 است)، در غیر این صورت پرچم 0 است.

· نصب پرچم سرریزاگر نتیجه تفریق از محدوده مقادیر گیرنده در کد معکوس فراتر رود، و خود گیرنده علامت را تغییر دهد، OF 1 است.

پرچم‌های SF و OF فقط هنگام تفریق اعداد علامت‌دار معنا پیدا می‌کنند، و پرچم AF فقط در هنگام تفریق اعداد اعشاری معنا پیدا می‌کند.

دستور کاهش محتوای مقصد - DEC

تیم گیرنده DEC(کاهش) 1 را از محتویات یک ثبات یا مکان حافظه کم می کند، اما (برخلاف دستورالعمل SUB) بر CF پرچم حمل تأثیر نمی گذارد.

دستورالعمل DEC اغلب در حلقه ها برای کاهش یک مقدار شمارنده تا زمانی که صفر یا منفی شود استفاده می شود. همچنین می توان از آن برای کاهش مقدار یک رجیستر شاخص یا اشاره گر هنگام دسترسی به مکان های متوالی حافظه استفاده کرد. مثلا:

دسامبر CX; کاهش ارزش 16 بیتی،

دسامبر AL; یا رجیستر 8 بیتی.

دسامبر MEM_BYTE؛ کاهش ارزش بایت،

دسامبر MEM_WORD؛ یا سلول حافظه کلمه.

دستورات بخش - DIV، IDIV

تیم DIV(تقسیم - تقسیم) تقسیم بدون علامت اعداد و دستور را انجام می دهد IDIV(تقسیم عدد صحیح - تقسیم اعداد صحیح) تقسیم علامت دار اعداد را انجام می دهد. فرمت این دستورات:

منبع DIV; جایی که منبع- تقسیم کننده اندازه بایت یا کلمه،

منبع IDIVدر یک مکان ثبت یا حافظه با هدف عمومی قرار دارد.

لطفا به موارد زیر توجه کنید:

1. سود سهام باید نسبت به تقسیم کننده دارای اندازه دو برابر باشد.

2. سود سهام باید همیشه در ثبات AX (هنگام تقسیم بر یک عدد 8 بیتی) یا در ثبات های DX و AX (هنگام تقسیم بر یک عدد 16 بیتی) باشد.

3. نتایج دستور به صورت زیر برگردانده می شود:

· اگر عملوند مبدأ یک بایت باشد، آن ضریب به رجیستر AL و باقیمانده به ثبات AN برگردانده می شود.

· اگر عملوند مبدأ یک کلمه باشد، ضریب به ثبات AX و باقیمانده به ثبات DX برگردانده می شود.

هر دو دستورالعمل وضعیت پرچم ها را تعریف نشده باقی می گذارند، اما اگر ضریب در ثبات مقصد (AL یا AX) قرار نگیرد، ریزپردازنده یک وقفه نوع 0 (تقسیم بر 0) ایجاد می کند.

4. سرریز نتیجه تقسیم در شرایط زیر رخ می دهد:

· مقسوم علیه 0 است.

· هنگام تقسیم بایت ها بدون علامت، سود سهام حداقل 256 برابر تقسیم کننده است.

· هنگام تقسیم کلمات بدون علامت، سود سهام حداقل 65536 برابر تقسیم کننده است.

· هنگام تقسیم بایت ها با علامت، ضریب خارج از محدوده -128 تا +127 قرار دارد.

· هنگام تقسیم کلمات با علامت، ضریب خارج از محدوده قرار دارد

32768 تا 32767.

در اینجا چند نمونه معمولی از عملیات تقسیم وجود دارد:

DIV BX; DX:AX را بر BX، بدون علامت تقسیم کنید.

DIV MEM_BYTE؛ AX را به یک بایت حافظه بدون علامت تقسیم کنید.

IDIV DL; AX را با علامت بر DL تقسیم کنید.

IDIV MEM WORD; DX:AX را به یک کلمه حافظه امضا شده تقسیم کنید.

دستورالعمل های DIV و IDIV مستقیماً بر مقدار فوری تقسیم نمی شوند زیرا پردازنده نمی تواند نوع داده تقسیم کننده را تعیین کند.

دستورالعمل ضرب - MUL، IMUL

تیم MUL(ضرب) اعداد بدون علامت را ضرب می کند، الف IMUL(ضرب عدد صحیح) اعداد صحیح امضا شده را ضرب می کند. ضرب و ضریب هر دو دستورالعمل باید یک نوع داده باشد، یعنی بایت، کلمات، دو کلمه و غیره.

این دستورات دارای فرمت زیر هستند:

منبع MUL; جایی که منبع- ثبت نام عمومی،

منبع IMUL; یا یک سلول حافظه به اندازه بایت یا کلمه.

به عنوان اولین عملوند (قابل ضرب)، دستورات MUL و IMUL از محتویات ثبات AL (برای عملیات روی بایت ها) یا ثبات AX (برای عملیات روی کلمات) استفاده می کنند. این محصول دارای دو سایز بوده و به شرح زیر مرجوع می گردد:

· ضرب بایت ها-محصول 16 بیتی را به رجیسترهای AN (بایت بالا) و AL (بایت کم) برمی گرداند.

· ضرب کلمات-محصول 32 بیتی را به رجیسترهای DX (کلمه بالا) و AX (کم کلمه) برمی گرداند. بنابراین، اندازه محصول n- عوامل بیت برابر است 2n.

ADC عدد صحیح با حمل

تیم adcاضافه کردن عملوند اول و دوم را انجام می دهد و مقدار CF flag را به نتیجه اضافه می کند. مقدار اصلی اولین عملوند (مقصد) از بین می رود و با نتیجه جمع جایگزین می شود. عملوند دوم بدون تغییر است. به عنوان اولین عملوند دستور adc

عملوندها می توانند بایت یا کلمه باشند و اعداد امضا شده یا بدون علامت را نشان دهند. تیم adc(همراه با تیم اضافه کردن) معمولا برای اضافه کردن اعداد 32 بیتی استفاده می شود. این فرمان بر پرچم‌های OF، SF، ZF، AF، PF و CF تأثیر می‌گذارد.

مثال 1:

Mov AX,1125h adc AX,2C25h; AX=3D4Bh، اگر CF = 1 بود؛ AX=3D4Ah، اگر CF = 0 بود

مثال 2:

; در فیلدهای داده: numlow dw 0FFFFh; قسمت پایین ترم 2 numhigh dw 000Sh; بالاترین قسمت ترم دوم؛ شماره 0005FFFFh=393215؛ در بخش برنامه: mov AX,000Sh; قسمت پایین ترم 1st mov BX,0002h; بالاترین قسمت از ترم 1;Number 00020005h=131077 add AX,numlow; اضافه شدن قطعات جوان AX=4، CF=1 adc BX، numhigh; اضافه شدن قطعات بالاتر با حمل. BX:AX=0008:0004h. ;شماره 00080004h=524292

استفاده از عملوندهای 32 بیتی و حالت های آدرس دهی اضافی پردازنده های 32 بیتی قابل قبول است. تیم adcبا عملوندهای 32 بیتی، می توان برای افزودن اعداد صحیح 64 بیتی استفاده کرد.

مثال:

; در فیلدهای داده mem321 dd 0FFFFFFFFh; قسمت پایین ترم 1 mem32h dd 98765432h; بالاترین قسمت از ترم 1; در بخش برنامه mov EAX,1; قسمت پایین ترم دوم mov EBX,0; بالاترین قسمت از ترم 2 اضافه کنید EAX,mem321. نیمه های پایینی را اضافه کنید;Sum=100000000h>32bit;EAX=000000h، حمل adc EBX,mem32h. نیمه های قدیمی را تا کنید و حمل کنید. EBX=90000001h; مبلغ: 9876543300000000h

افزودن عدد صحیح

تیم اضافه کردنجمع عملوند اول و دوم را انجام می دهد. مقدار اصلی اولین عملوند (مقصد) از بین می رود و با نتیجه جمع جایگزین می شود. عملوند دوم بدون تغییر است. به عنوان اولین عملوند دستور اضافه کردنشما می توانید یک ثبات (به جز یک قطعه یک) یا یک سلول حافظه را مشخص کنید، دومی می تواند یک ثبات (به جز یک قطعه یک)، یک سلول حافظه یا یک مقدار فوری باشد، اما مجاز نیست هر دو عملوند را به طور همزمان به عنوان حافظه تعریف کنید. سلول ها.

عملوندها می توانند بایت یا کلمه باشند و اعداد امضا شده یا بدون علامت را نشان دهند. دستور add را می توان برای اضافه کردن اعداد صحیح معمولی و اعداد اعشاری باینری (با استفاده از ثبات AX برای ذخیره نتیجه) استفاده کرد. اگر اعداد اعشاری رمزگذاری شده باینری (BCD) بدون بسته بندی اضافه شوند، پس از دستور اضافه کردندستور aaa باید استفاده شود. اگر اعداد بسته بندی شده اضافه شوند، دستور بله. این فرمان بر پرچم‌های OF، SF، ZF، AF، PF و CF تأثیر می‌گذارد.

مثال 1:

Mov BX,lFFEh mov CX,3 افزودن BX,CX; BX=2001h، CX=0003h

مثال 2:

Mov AX,25h add AX,12h; AX=0037h

مثال 3:

; در فیلدهای داده: mem dw 128 ؛ در بخش برنامه: add mem,100; mem=228

ADC عدد صحیح جمع با حمل

دستور adc عملوند اول و دوم را اضافه می کند و مقدار CF flag را به نتیجه اضافه می کند. مقدار اصلی اولین عملوند (مقصد) از بین می رود و با نتیجه جمع جایگزین می شود. عملوند دوم بدون تغییر است. عملوند اول دستور adc می تواند یک ثبات (به جز یک قطعه) یا یک سلول حافظه باشد، دومین عملوند می تواند یک ثبات (به جز یک قطعه)، یک سلول حافظه یا یک مقدار فوری باشد، اما مجاز به تعیین نیست. هر دو عملوند به طور همزمان به عنوان سلول های حافظه. عملوندها می توانند بایت یا کلمه باشند و اعداد امضا شده یا بدون علامت را نشان دهند. دستور adc (همراه با دستور add) معمولاً برای اضافه کردن اعداد 32 بیتی استفاده می شود. این فرمان بر پرچم‌های OF، SF، ZF، AF، PF و CF تأثیر می‌گذارد.

مثال 1

Mov AX,1125h adc AX,2C25h ;AX=3D4Bh، اگر CF = 1 بود ;AX=3D4Ah، اگر CF = 0 بود
مثال 2; در فیلدهای داده: numlow dw 0FFFFh ; قسمت پایین ترم دوم numhigh dw 000Sh ; قسمت بالای ترم 2; شماره 0005FFFFh=393215 ؛ در بخش برنامه: mov AX,000Sh ; قسمت پایین ترم BX 1st 0002h ؛ بالاترین قسمت ترم اول؛ شماره 00020005h=131077 اضافه کردن AX,numlow؛ اضافه کردن قسمت های پایین. AX=4، CF=1 adc BX، numhigh ;افزودن قطعات بالاتر با انتقال.BX:AX=0008:0004h. ;شماره 00080004h=524292
استفاده از عملوندهای 32 بیتی و حالت های آدرس دهی اضافی پردازنده های 32 بیتی قابل قبول است. دستورالعمل adc با عملوندهای 32 بیتی را می توان برای افزودن اعداد صحیح 64 بیتی استفاده کرد. مثال 3; در فیلدهای داده mem321 dd 0FFFFFFFFh ;قسمت پایین ترم اول mem32h dd 98765432h ;قسمت بالای ترم اول. در بخش برنامه mov EAX,1 ; قسمت پایین ترم دوم mov EBX,0 ; قسمت بالای ترم دوم EAX,mem321 ;افزودن نیمه های پایین ;Sum=100000000b>32 بیت;EAX=000000h, حمل adc EBX,mem32h ؛ نیمه های قدیمی تر را اضافه کنید و انتقال دهید. EBX=90000001h ;مقدار: 9876543300000000h
افزودن عدد صحیح

دستور add عملوند اول و دوم را اضافه می کند. مقدار اصلی اولین عملوند (مقصد) از بین می رود و با نتیجه جمع جایگزین می شود. عملوند دوم بدون تغییر است. عملوند اول دستور add را می توان به عنوان یک ثبات (به جز یک قطعه یک) یا یک سلول حافظه تعیین کرد و عملوند دوم می تواند یک ثبات (به جز یک قطعه یک)، یک سلول حافظه یا یک مقدار فوری باشد، اما مجاز به تعریف همزمان هر دو عملوند به عنوان سلول های حافظه نیست. عملوندها می توانند بایت یا کلمه باشند و اعداد امضا شده یا بدون علامت را نشان دهند. دستور add را می توان برای اضافه کردن اعداد صحیح معمولی و اعداد اعشاری باینری (با استفاده از ثبات AX برای ذخیره نتیجه) استفاده کرد. هنگام اضافه کردن اعداد اعشاری رمزگذاری شده باینری (BCD) بدون بسته بندی، از دستور aaa بعد از دستور add استفاده کنید. اگر اعداد بسته بندی شده اضافه شدند، دستور daa را بدهید. این فرمان بر پرچم‌های OF، SF، ZF، AF، PF و CF تأثیر می‌گذارد. مثال 1

Mov BX,lFFEh mov CX,3 add BX,CX ;BX=2001h, CX=0003h
مثال 2 mov AX,25h افزودن AX,12h ;AX=0037h
مثال 3; در فیلدهای داده: mem dw 128 ؛ در بخش برنامه: add mem,100 ;mem=228
مثال 4 mov AX,0507h ;BCD unpacked 57 add AL,05h ;BCD 5, AX=050Ch aaa ;AX=0602h, BCD 62
مثال 5 mov AL,57h ;BCD packed 57 add AL,05h ;BCD 5, AL=5Ch daa ;AL=62h, BCD 62

استفاده از عملوندهای 32 بیتی و حالت های آدرس دهی اضافی پردازنده های 32 بیتی قابل قبول است. مثال

Mov EAX,98765432h افزودن EAX,11111111h ; EAX=A9876543h
و منطقی و

دستور and یک ضرب منطقی (بیتی) از عملوند اول در دومی را انجام می دهد. مقدار اصلی اولین عملوند (مقصد) از بین می رود و با نتیجه ضرب جایگزین می شود. عملوند اول دستور and می تواند یک ثبات (به جز قطعه یک) یا یک سلول حافظه باشد، عملوند دوم می تواند یک ثبات (به جز یک قطعه یک)، یک سلول حافظه یا یک مقدار فوری باشد، اما مجاز نیست هر دو عملوند را به طور همزمان به عنوان سلول های حافظه مشخص کنید. عملوندها می توانند بایت یا کلمات باشند. این فرمان بر پرچم های SF، ZF و PF تأثیر می گذارد. قوانین ضرب بیتی:

بیت عملوند اول 0101 بیت عملوند دوم 0011 بیت نتیجه 0001 مثال 1 mov AX,0FFEh و AX,5555h ;AX=0554h مثال 2; در فیلدهای داده: mem dw 0С003h ؛ در بخش برنامه: mov AX,700Eh و AX,mem ;AX=4002h

استفاده از عملوندهای 32 بیتی و حالت های آدرس دهی اضافی پردازنده های 32 بیتی قابل قبول است. مثال

Mov EDX, 0FA8 8 0 0 4 Lh و EDX,0FF00000Fh ; EDX = FA000001h
386P+ ARPL
تنظیم سطح امتیاز انتخابگر درخواستی

دستور aprl انتخابگر را با یک الگوی حاوی حداکثر سطح امتیاز مجاز (معمولاً انتخابگر CS) مقایسه می‌کند و مقدار مورد آزمایش را در پایین‌ترین سطح از دو سطح امتیاز تنظیم می‌کند. اگر تغییر سطح مورد نیاز نباشد، پرچم ZF بازنشانی می شود و در صورت لزوم تنظیم می شود. اولین عملوند دستور aprl می تواند یک ثبات 16 بیتی یا یک کلمه حافظه با یک انتخابگر قابل بررسی باشد. عملوند دوم یک ثبات 16 بیتی با انتخابگر الگو است. 386+ محدود
بررسی شاخص آرایه برای آرایه خارج از محدوده

دستور bound بررسی می کند که آیا شاخص مشخص شده که به عنوان یک عدد علامت دار در نظر گرفته می شود، در محدوده های مشخص شده توسط عملوند دوم قرار دارد یا خیر. اگر ایندکس از مرزهای آرایه زیر یا بالاتر فراتر رود، یک وقفه با بردار 5 ایجاد می شود. عملوند اول باید یک ثبات حاوی شاخص در حال بررسی باشد، دوم - آدرس یک فیلد حافظه با دو مرز آرایه. در حال بررسی دستور Bound به هر دو عملوند 16 بیتی و 32 بیتی اجازه می دهد (اما هر دو عملوند اول و دوم باید از یک نوع باشند).

مونتاژ کننده- زبان اسمبلی برای آدمک ها

زبان اسمبلی برای آدمک ها.(#2) (ج) میخائیل اسپیتسین 1995پرچم ها رجیستر "F" پردازنده پرچم نامیده می شود. آن چیست؟ پرچم متغیری است که می تواند دو حالت داشته باشد: set (برابر یک) و پاک شده (برابر صفر). بنابراین، ثبات "F" را می توان به عنوان مجموعه ای از هشت بیت پرچم در نظر گرفت. ما فقط می توانیم از چهار مورد از آنها استفاده کنیم: پرچم صفر، پرچم حمل، پرچم علامت، و پرچم سرریز برابری.عملیات حسابی حساب یک علم بسیار بسیار مفید است؛ ما دائماً چیزی را می شماریم: جمع، تفریق، تقسیم، ضرب. اکنون در مورد نحوه انجام این کار در اسمبلر صحبت خواهیم کرد. ما با ساده ترین چیز شروع می کنیم، به عنوان مثال، برای ثبت "A" یکی را به چیزی اضافه می کنیم: **************************** *** ** LD A,NUBER INC A RET ******************************** همانطور که می بینید، بسیار ساده است برای این دستور "INC" وجود دارد - increment (افزایش یک) و به دنبال آن یک عملوند، یعنی. برخی از جفت ثبت یا ثبت: ******************************** INC A INC HL INC H INC DE INC E INC IY INC E INC (HL) INC (IX+N) INC (IY+N) ************************************** اگر می خواهید هر سلول حافظه را یک بار افزایش دهید، باید این کار را انجام دهید: ************************************* ****** *** LD HL,ADDRES LD IX,ADDRES INC (HL) INC (IX+0) RET RET ********************* **************** ***** اگر با یک سلول حافظه کار می کنید، گزینه اول سریعتر کار می کند و راحت تر است، اما اگر در یک جدول کار می کنید، اینطور نیست. اقتصادی و زشت مقایسه کنید: باید بایت های اول، پنجم و دهم جدول را یک بایت افزایش دهیم: *********************************** * LD HL,TABL+1 LD IX,TABL INC (HL) INC (IX+1) LD HL,TABL+5 INC (IX+5) INC (HL) INC (IX+10) LD HL,TABL+10 RET INC (HL) RET ******************************** همه آنچه در بالا در مورد افزایش یک عدد گفته شد درست است و برای کاهش، یعنی برای کاهش یک: ******************************** DEC A DEC HL DEC L DEC IX دسامبر H DEC DE DEC E دسامبر قبل از میلاد دسامبر DEC IY دسامبر C دسامبر IX دسامبر B دسامبر (HL) دسامبر (IX+N) دسامبر (IX+N) ********************* *********** حالا فرض می کنیم که باید ثبت "A" را نه یک، بلکه مثلاً ده افزایش دهیم: **************** ***************** LD A,NUMBER ADD A,10 RET ************************* * ****** می توانید ثبات "A" را با یک عدد و سایر ثبات ها و با یک سلول حافظه آدرس دهی شده توسط جفت های ثبات "HL"، "IX" و "IY" اضافه کنید. همچنین می‌توانید جفت‌های ثبت را با «HL»، «IX» و «IY» اضافه کنید. (PureBasic - فایل سیستم) ******************************** ADD A,N ADD A,(HL) ADD A ,A ADD A,(IX+N) ADD A,B ADD A,(IY+N) ADD A,C ADD HL,HL ADD A,D ADD HL,BC ADD A,E ADD HL,DE ADD A,H ADD HL,SP ADD IX,IX ADD IX,BC ADD IX,DE ADD IX,SP ****************************** ** همانطور که می بینید، مجموعه دستورات بسیار بزرگ است. هنگام اجرای این دستور ممکن است یک خطا رخ دهد: ******************************** LD A,45 LD B,230 ADD A ,B RET ******************************** مجموع "A" و "B" از 255 بیشتر شد و بنابراین در "A" " نه 275، بلکه 20 خواهد بود (ثبت نام "A" لاستیکی نیست). برای اینکه بدانیم سرریز اتفاق افتاده است، پردازنده پرچم حمل را روی یک تنظیم می کند. تنها چیزی که باقی می ماند بررسی آن است. همانطور که "INC" دارای "DEC" است، "ADD" نیز یک "couple" دارد، این "SUB" است و ویژگی های خاص خود را دارد. دستور "SUB" فقط با ثبات "A" کار می کند، بنابراین هنگام نوشتن یادداشت های این دستور، "A" حذف می شود: ********************* *********** SUB N SUB C SUB A SUB H SUB B SUB D SUB E SUB (HL) SUB (IX+N) SUB (IY+N) ******** * ********************** این فرمان بر روی پرچم حمل به همان شیوه "ADD" تأثیر می گذارد. علاوه بر جفت فرمان "ADD" و "SUB"، یک جفت دیگر نیز وجود دارد. دستورات "ADC" و "SBC" با در نظر گرفتن پرچم حمل، یعنی. هنگام جمع یا تفریق، مقدار پرچم حمل به نتیجه اضافه (کاهش) می شود. دو دستور ویژه برای تنظیم پرچم حمل وجود دارد - "SCF" و "CCF". "SCF" - پرچم حمل را روی یک تنظیم کنید. "CCF" - پرچم حمل را روی صفر تنظیم کنید. ******************************** ADC A,N SBC A,N ADC A,A SBC A,A ADC A ,H SBC A,H ADC A,L SBC A,L ADC A,D SBC A,D ADC A,E SBC A,E ADC A,B SBC A,B ADC A,C SBC A,C ADC A,( HL) SBC A, (HL) ADC A, (IX+N) SBC A, (IX+N) ADC A, (IY+N) SBC A,)IY+N) ADC HL,HL SBC HL,HL ADC HL ,BC SBC HL,BC ADC HL,DE SBC HL,DE ADC HL,SP SBC HL,SP **************************** **** و اکنون نمونه هایی از عملکرد دستورات "ADC" و "SBC": ***************************** ************ * LD A,10 LD A,10 LD B,5 LD B,5 CCF CCF SBC A,B ADC A,B RET RET A=5 B=5 A=15 B=5 ******** ************************ به جای دو دستور "CCF" و "SBC A,B" شما می توانید به سادگی "SUB B" را قرار دهید، نتیجه یکسان خواهد بود. ******************************** LD A,10 LD A,10 LD B,5 LD B,5 SCF SCF SBC A,B ADC A,B RET RET A=4 B=5 A=16 B=5 **************************** **** همانطور که از نتایج مشاهده می شود، پرچم حمل به طور قابل توجهی بر نتیجه عملیات تأثیر می گذارد. هنگام تفریق از نتیجه کم می شود و هنگام جمع به نتیجه اضافه می شود. تقریباً همه چیز در مورد عملیات جمع و تفریق پوشش داده شده است؛ اکنون در مورد تقسیم و ضرب صحبت خواهیم کرد. متأسفانه SPECCY دستور تقسیم و ضرب ندارد، اما این دستورات می توانند از چندین دستور دیگر تشکیل شوند. به عنوان مثال، ما باید محتویات دو ثبات را ضرب کنیم - "A" و "C": ********************************* ********** *** LD A,10 LD C,5 LD B,A XOR A LOOP ADD A,C DJNZ LOOP RET *************** ********** ******* در مثال دو دستور جدید وجود دارد - "XOR A" و "DJNZ LOOP". "XOR A" ثبات "A" را پاک می کند و دستور "DJNZ LOOP" همه دستورات را تکرار می کند، از دستور مشخص شده با یک برچسب (به عنوان مثال، "LOOP") تا دستور "DJNZ" (به دنبال همان برچسب). ka، همانطور که در ابتدای چرخه)؛ تعداد تکرارها در ثبات "B" مشخص شده است. با استفاده از این واقعیت که ضرب M در N به معنای جمع کردن عدد M به خود N برابر است، می توانید مثال بالا را درک کنید. از این ملک می توان برای تقسیم نیز استفاده کرد. خودت آن را امتحان کن. دفعه بعد در مورد دستورات مقایسه و کار با بیت ها صحبت خواهیم کرد.________________________________

سایر مقالات این شماره:





بالا