在MacOS上的x86程序集中的For-Loop

时间:2018-04-30 21:02:42

标签: macos assembly x86

我正在尝试使用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

  

我意识到在StackOverflow上已多次询问有关在汇编中创建for循环的问题,但是,我无法找到任何关于具有Mac OSX特定程序集的for循环的问题或答案。任何人都可以解释为什么我收到错误以及如何纠正错误?在我看来,Mac OSX只接受x86使用&#34; AT&amp; T&#34;句法。谁能告诉我为什么会这样?

1 个答案:

答案 0 :(得分:2)

看着这条指令:

movl $10, %cx

movl代表move long,即移动32位。 %cx但是是一个16位寄存器。这就是你的汇编程序抱怨的原因。要么移动到32位寄存器%ecx,要么使用16位移动指令movw。或者,只需使用mov,因为汇编程序可以从寄存器操作数中推断出大小。