19-09-2022, 07:48 PM
أولا ذلك يعتمد على بنية الكمبيوتر.
32bit
bit = 1 bit
nibble = 4 bits = 1/2 byte
byte = 8 bits = 2 nibbles
WORD = 2 bytes = 4 nibbles= 16 bits
DWORD = 2 WORDs = 4 bytes = 8 nibbles = 32 bits
QWORD = 2 DWORDs = 4 WORDs = 64 bits
bit = 1 bit
nibble = 4 bits = 1/2 byte
byte = 8 bits = 2 nibbles
WORD = 2 bytes = 4 nibbles= 16 bits
DWORD = 2 WORDs = 4 bytes = 8 nibbles = 32 bits
QWORD = 2 DWORDs = 4 WORDs = 64 bits
في نظام 64 bits ، سيكون مزدوجًا.
حرف S يقصد به Signed
تعني Signed binary numbers بأنه يمكن تمثيل كل من الأرقام الموجبة والسالبة. يمثل bit الأخير دلالة العلامة
مثل BYTE فإذا أردنا أن نستعمل الموجب و السالب أصبحت SBYTE
لو فرضنا أنه عندنا
arrayA SBYTE -5, -4, 3, 2
arrayB WORD 3000h, 4000h, 6000h, 9000h
arrayC SWORD -17, -36
arrayB WORD 3000h, 4000h, 6000h, 9000h
arrayC SWORD -17, -36
MOV AX, arrayA
غير صحيحة لأن AX تتكون من 16 bits و arrayA من نوع SBYTE أي 8 bits
MOV AX, arrayB
صحيحة لأن AX و arrayB من نوع 16 bits أو WORD
MOV EAX, arrayC
غير صحيحة لأن EAX من نوع DWORD أي 32 bits و arrayC من نوع SWORD
MOV arrayD, arrayA
لا توجد تعليمات "MOV memory/memory"
يُسمح memory operand واحد فقط لكل instruction ولماذا الجواب لأنه هذه هي الطريقة التي يتم بها encode
MOVZX AX, arrayB
غير صحيحة لنه ليس هناك مكان ل zero-extended ولو كانت هنا AX و arrayB من نفس النوع أي 16 bits أي WORD.
MOVZX arrayB, AL
غير صحيحية لنه لا يوجد MOVZX memory, register ولكن يوجد فقط MOVZX register, memory أو MOVZX register, register
MOV DS, AX
صحيحة لأنه كلا DS و AX من نوع 16 bits
MOV DS, 5000h
غير صحيحة مع العلم أن قيمة DS هي 16 bits و 5000h تناسب 16 bits ولكن لا يوجد تعليمة هكذا
MOV segment register, immediate
لأن encoding يكون فقط هكذا
MOV segment register, memory
مثال
MOV DS, [5000h]
أو
MOV segment register, register
مثال
MOV DS, AX