Что я делаю не так с моим ассемблерным кодом x86-64?

#assembly #x86-64 #nasm

#сборка #x86-64 #nasm

Вопрос:

Сегодня я написал одну из своих самых первых программ на ассемблере, но я продолжаю получать сообщение об ошибке.

Я использую ОС win64 и ассемблер nasm.

Это мой код:

 section .data

section .bss

rcxOfFirst resq 1d
rdxOfFirst resq 1d


section .text
    global _main
_main:


mov ah,2ch  ; display system time
int 21h

mov rcxOfFirst,RCX
mov rdxOfFirst,RDX
  

time2.asm: 18: ошибка: недопустимая комбинация кода операции и операндов; Мое сообщение об ошибке

time2.asm: 19: ошибка: недопустимая комбинация кода операции и операндов

Комментарии:

1. Возможно, вам понадобятся квадратные скобки вокруг вашего операнда для разыменования указателя: mov [rcxOfFirst],RCX

2. Также обратите int 21h внимание на 16-разрядную функцию DOS, в то время как вы, похоже, пишете 64-разрядный код для другой ОС (который вы забыли указать вместе с используемым ассемблером). Это не сработает. Кроме того, ваша программа не имеет конца, она завершится сбоем, даже если вы соберете ее и свяжете.

3. Как вы вызываете nasm?

4. Немедленным не может быть назначение, только память или регистр. mov rcxOfFirst,RCX в основном то же самое, что и mov 12345, RCX , но компоновщик заполняет адрес символа во время компоновки.

Ответ №1:

В синтаксисе Intel регистр / адрес назначения стоит первым в списке операндов, а источник — вторым.

     mov rcx, rcxofFirst ; loads rcx with rcxofFirst.
  

Вы перепутали порядок своих операндов.
Также вы, кажется, пишете 16-разрядную сборку с ‘int 21h’, которая использовалась в DOS.