For-Loop в сборке x86 на MacOS - PullRequest
0 голосов
/ 01 мая 2018

Я пытаюсь изучить ассемблер с помощью Mac OSX, но у меня invalid operand ошибки. В настоящее время я пытаюсь создать простой for цикл до 10 в сборке, эквивалентный следующему в c++:

for(int i = 0; i < 10; i++){
}

Моя текущая сборка (simpleloop.s):

.globl _main

_main:
  pushq %rbp
  movq %rsp, %rbp
  subq $16, %rsp
  movl $10, %cx
  loop:
    dec %cx
    jnz loop
  leave
  ret

Однако, когда я запускаю этот фрагмент с помощью gcc simpleloop.s, я получаю следующее сообщение об ошибке:

ошибка: недопустимый операнд для инструкции Movl $ 10,% cx

Я понимаю, что вопросы о создании циклов for в сборке задавались много раз в StackOverflow, однако я не могу найти ни одного вопроса или ответа относительно циклов for со сборкой, специфичной для Mac OSX. Может кто-нибудь объяснить, почему я получаю ошибку и как ее можно исправить? Мне кажется, что Mac OSX принимает только x86 с использованием синтаксиса «AT & T». Может кто-нибудь сказать мне, почему это?

1 Ответ

0 голосов
/ 01 мая 2018

Глядя на эту инструкцию:

movl $10, %cx

movl означает move long, т.е. переместить 32 бита. %cx однако это 16-битный регистр. Вот почему ваш ассемблер жалуется. Либо перейдите в 32-битный регистр %ecx, либо используйте команду 16-битного перемещения movw. Или просто используйте mov, так как ваш ассемблер может определить размер из вашего операнда-регистра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...