अंकगणितीय निर्देश - असेम्बली भाषा में अंकगणितीय संक्रियाएँ या अंकगणितीय निर्देश गणितीय संक्रियाएँ जैसे जोड़, घटाव, गुणा, भाग आदि करने के लिए प्रयुक्त होते हैं।
NASM - INC DEC ADD and SUB MUL/IMUL DIV/IDIV
अंकगणितीय निर्देश - INC DEC ADD और SUB MUL/IMUL DIV/IDIV NASM असेंबली भाषा में, ये (INC, DEC, ADD, SUB, MUL/IMUL, DIV/IDIV) निर्देश उसी तरह से उपयोग किए जाते हैं जैसे अंकगणितीय ऑपरेटर (+ +, --, +, -, ×, ÷).
INC निर्देश
INC निर्देश का उपयोग एक ऑपरेंड (++) को बढ़ाने के लिए किया जाता है। यह एक ही ऑपरेंड पर काम करता है जो या तो रजिस्टर में या मेमोरी में हो सकता है।
Syntax - INC destination
INC EBX ; Increments 32-bit register
INC DL ; Increments 8-bit register
INC [count] ; Increments the count variable
ऑपरेंड गंतव्य 8-बिट, 16-बिट या 32-बिट ऑपरेंड हो सकता है।
DEC अनुदेश
DEC निर्देश - DEC निर्देश का उपयोग किसी ऑपरेंड को एक (--) से कम करने के लिए किया जाता है। यह एक ही ऑपरेंड पर काम करता है जो या तो रजिस्टर में या मेमोरी में हो सकता है।
Syntax - DEC destination
DEC EBX ; Increments 32-bit register
DEC DL ; Increments 8-bit register
DEC [count] ; Increments the count variable
संकार्य गंतव्य 8-बिट, 16-बिट या 32-बिट संकार्य हो सकता है।
ADD and SUB अनुदेश
ADD और SUB निर्देशों का उपयोग बाइट, शब्द और दोहरे शब्दों के आकार में बाइनरी डेटा के सरल जोड़ / घटाव को करने के लिए किया जाता है।
add eax, ebx
add eax, '0'
sub ebx, '0'
sub eax, '7 '
sub eax, ebx
ADD/SUB निर्देश - पर लागू हो सकते हैं
- Register to register
- Memory to register
- Register to memory
- Register to constant data
- Memory to constant data
अन्य निर्देशों की तरह, ADD/SUB निर्देशों का उपयोग करके मेमोरी-टू-मेमोरी संचालन संभव नहीं है। एक ADD या SUB ऑपरेशन ओवरफ्लो और कैरी फ्लैग को सेट या क्लियर करता है।
The MUL/IMUL निर्देश
बाइनरी डेटा को गुणा करने के लिए दो निर्देश हैं। MUL (मल्टीप्ली) निर्देश अहस्ताक्षरित डेटा को हैंडल करता है और IMUL (इंटीजर मल्टीप्ली) साइन किए गए डेटा को हैंडल करता है। दोनों निर्देश कैरी और ओवरफ्लो फ्लैग को प्रभावित करते हैं।.
Syntax - MUL/IMUL multiplier
दोनों ही मामलों में गुणक एक संचायक में होगा, गुणक और गुणक के आकार के आधार पर और उत्पन्न उत्पाद को संकार्य के आकार के आधार पर दो रजिस्टरों में संग्रहीत किया जाता है।
निम्नलिखित खंड तीन अलग-अलग मामलों के साथ एमयूएल निर्देशों को समझाता है −
- दो बाइट गुणा करते समय - गुणक AL रजिस्टर में है, और गुणक मेमोरी या किसी अन्य रजिस्टर में एक बाइट है। उत्पाद AX में है। उत्पाद के उच्च क्रम के 8 बिट्स AH में संग्रहीत होते हैं और निम्न क्रम के 8 बिट्स AL में संग्रहीत होते हैं।
AL × 8 bit source = AH AL - जब दो एक शब्द के मानों का गुणा करते समय - जब दो एक-शब्द मानों को गुणा किया जाता है - परिणाम AX और DX में संग्रहीत होता है।
AX × 16 bit source = DX AX - जब दो डबलवर्ड मानों को गुणा करते समय - जब दो डबलवर्ड मानों को गुणा किया जाता है, तो गुणक EAX में होना चाहिए। उत्पाद EDX में संग्रहीत है: EX रजिस्टर, यानी, उच्च-क्रम 32-बिट्स EDX रजिस्टर में संग्रहीत हैं और निम्न-ऑर्डर 32-बिट्स EAX रजिस्टर में संग्रहीत हैं।
EAX × 32 bit source = EDX EAX
उदाहरण
MOV AL, 10
MOV DL, 25
MUL DL
...
MOV DL, 0FFH ; DL= -1
MOV AL, 0BEH ; AL = -66
IMUL DL
DIV/IDIV निर्देश
DIV (डिवाइड) निर्देश का उपयोग अहस्ताक्षरित डेटा के लिए किया जाता है और IDIV (इंटीजर डिवाइड) का उपयोग हस्ताक्षरित डेटा के लिए किया जाता है।
विभाजन संक्रिया से दो तत्व उत्पन्न होते हैं - एक भागफल और एक शेषफल। गुणन के मामले में, अतिप्रवाह नहीं होता है क्योंकि उत्पाद को धारण करने के लिए डबल-लम्बाई रजिस्टरों का उपयोग किया जाता है। हालांकि, विभाजन के मामले में अतिप्रवाह हो सकता है। यदि अतिप्रवाह होता है, तो प्रोसेसर बाधा उत्पन्न करता है।
Syntax - DIV/IDIV divisor
लाभांश संचयकर्ता में है। दोनों निर्देश 8-बिट, 16-बिट या 32-बिट ऑपरेंड के साथ काम कर सकते हैं। ऑपरेशन सभी छह स्थिति फ़्लैग को प्रभावित करता है।
निम्नलिखित खंड विभिन्न ऑपरेंड आकारों के साथ विभाजन के तीन मामलों की व्याख्या करता है −
- जब भाजक 1 बाइट हो -लाभांश को AX रजिस्टर (16 बिट्स) में माना जाता है। विभाजन के बाद भागफल AL रजिस्टर में जाता है और शेष AH रजिस्टर में जाता है।
16 bit divident
AX
8 bit divisor
=Quoitient
AL
AndRemainde
AH
- जब भाजक 1 शब्द हो - लाभांश को 32 बिट लंबा और DX:AX रजिस्टरों में माना जाता है। उच्च-क्रम के 16 बिट DX में हैं और निम्न-क्रम के 16 बिट AX में हैं। विभाजन के बाद, 16-बिट भागफल AX रजिस्टर में जाता है और 16-बिट शेष भाग DX रजिस्टर में जाता है।
32 bit divident
DXAX
16 bit divisor
=Quoitient
AX
AndRemainde
DX
- जब भाजक दोहरा शब्द हो - लाभांश को 64 बिट लंबा और EDX: EAX रजिस्टरों में माना जाता है। ईडीएक्स में उच्च क्रम के 32 बिट और ईएक्स में निम्न क्रम के 32 बिट हैं। विभाजन के बाद, 32-बिट अंश EAX रजिस्टर में जाता है और 32-बिट शेष EDX रजिस्टर में जाता है।
64 bit divident
EDXEAX
16 bit divisor
=Quoitient
EAX
AndRemainde
EDX
Exampal
निम्नलिखित उदाहरण में आप विधानसभा अंकगणितीय संचालन और निर्देश देख सकते हैं।
section .text
global _start ;must be declared for using gcc
_start: ;tell linker entry point
mov ax,'8'
sub ax, '0'
mov bl, '2'
sub bl, '0'
div bl
add ax, '0'
mov [res], ax
mov ecx,msg
mov edx, len
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov ecx,res
mov edx, 1
mov ebx,1 ;file descriptor (stdout)
mov eax,4 ;system call number (sys_write)
int 0x80 ;call kernel
mov eax,1 ;system call number (sys_exit)
int 0x80 ;call kernel
section .data
msg db "The result is:", 0xA,0xD
len equ $- msg
segment .bss
res resb 1
When the above code is compiled and executed, it produces the following result −
The result is: 4