2016-07-12 3 views
2

Когда я пытаюсь собрать следующую программу:недействительный суффикс инструкции для `мов» (MOVW% ай% EBX)

.globl _start 
.section .text 

_start:  movw  $-23, %ax 
      movl  $-1, %ebx # -1 = $0xffffffff 
      movw  %ax, %ebx 

      movl  $1, %eax 
      movl  $0, %ebx 
      int   $0x80 

Я получаю сообщение об ошибке:

demo.s: Assembler messages: 
demo.s:7: Error: invalid instruction suffix for `mov' 

Таким образом, корень proglem лежит здесь:

movw  %ax, %ebx 

Но дело в том, что я не думаю, что я делаю это совершенно неправильно, плюс это пример, используемый в го e book Я сейчас читаю: Professional Assembly Language by Richard Blum (2005)

+4

'movw% ax,% ebx' не имеет смысла. Это «переместить ** 16 бит ** регистр AX в ** 32 бит ** регистр EBX». Как бы Вы это сделали? Нулевое расширение ('movzwl% ax,% ebx')? Расширение знака ('movswl% ax,% ebx')? Вы уверены, что автор не намеревался «movw% ax,% bx'? Я не могу сказать из использования в источнике. –

+0

'movw% ax,% ebx' - это точно так, как оно представлено в книге. –

+1

Судя по разделу «Исправление» для этой книги, я бы немного осторожно относился к источникам. Просто убедитесь, что для каждой объясняемой вещи вы можете написать свой собственный источник без книги, который работает в отладчике точно так, как ожидалось (следите за изменениями всех регистров, памяти и флагов).И в основном есть только одна каноническая книга для разработчиков ASM. Справочное руководство по инструкциям. Все остальное походит на вспомогательные колеса на велосипеде, чрезвычайно полезно, пока вы не перейдете на определенный уровень, тогда это бремя. Следующая полезная книга ASM - это либо подробная архитектура целевой платформы, либо книги математической теории. – Ped7g

ответ

5

Вы не писали, что хотите делать с этой программой.

Сначала вы положили -23 в ax, затем -1 в ebx, то вы пытаетесь переместить ax в ebx, который не действует на процессоре x86, так как ax является 16bit и 32bit ebx является регистром. mov не может преобразовать ширину данных во время обработки.

Чтобы сделать работу, существуют два основных варианта.

  • если вы хотите только ниже 1 ebx модифицированных (по 16b из ax), вы можете сделать mov %ax, %bx, сохраняя верхние 1 ebx неповрежденных. (в вашем случае результат будет -23 в ebx/bx/bl).

  • , если вы хотите расширить значение 16b в значении 32b, вы можете сделать что-либо:

    1. movswl %ax, %ebx # sign-extended conversion (movsx in Intel syntax)
    2. movzwl %ax, %ebx # zero-extended conversion (movzx in Intel syntax)

В 1. ebxbx и bl) будет содержать -23. В 2. ebx будет содержать 0x0000FFE9, поэтому ebx будет 65513, bx и bl будет -23, если рассматривать как целое число со знаком. Или 65513 для bx и 233 в bl при обработке как целые без знака.

Об этой книге ... вы уверены? Прочтите это снова, должно быть, опечатка, или вы не замечаете крошечных деталей.