2016-07-12 3 views
2

나는 다음과 같은 프로그램을 컴파일하려고 : 그래서,잘못된 명령 접미사

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

:이 오류 메시지가

.globl _start 
.section .text 

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

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

movw  %ax, %ebx 

을하지만 것은 내가 일을 완전히 잘못하고있는 무슨을 생각하지 않는 것이 플러스 그 일에 사용되는 예제 다음 proglem의 뿌리는 여기있다 전자 서 나는 현재 읽고있다 : 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

그 책에 대한 에라타 (Errata) 섹션에서 판단 할 때, 나는 그 책의 출처에 대해 약간 조심 스러울 것입니다. 단지 설명이 끝나면 디버거에서 예상대로 정확하게 작동하는 책없이 자신 만의 소스를 작성할 수 있습니다 (모든 레지스터, 메모리 및 플래그 변경에주의하십시오).기본적으로 ASM 개발자를위한 표준 책은 하나뿐입니다. 지침 참조 가이드. 그 밖의 모든 것은 자전거의 도우미 바퀴와 같으며 일정 수준 이상이 될 때까지 매우 도움이됩니다. 그러면 부담입니다. 다음 유용한 ASM 서적은 대상 플랫폼의 세부 아키텍처 또는 수학 이론 서적입니다. – Ped7g

답변

5

당신은 그 프로그램으로하고 싶은 것을 쓰지 않았다.

먼저 당신은 다음 ax는 16 비트이며, ebx는 32 비트 레지스터로, x86 프로세서에 유효하지 않습니다 ebxax을 이동하려고, ebx에 다음 -1, ax-23을 넣어. mov은 처리 중에 데이터 너비를 변환 할 수 없습니다.

두 가지 기본 옵션이 있습니다.

  • 당신은 16B 수정 ebx (ax에서 16B로), 당신은 그대로 ebx의 상단 (16B)을 유지 mov %ax, %bx을 할 수의 낮은합니다. (귀하의 경우 결과는 -23, ebx/bx/bl). 당신은 32B 값에 (16B)의 가치를 확장하려는 경우

  • , 당신이 할 중 하나를 수행 할 수 있습니다

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

ebx (및 bxbl도 포함)은 -23을 포함합니다. 2. ebx은 0x0000FFE9를 포함하므로 ebx65513, bxbl-23이되며 부호있는 정수로 처리됩니다. 또는 bx의 경우 65513이고 부호없는 정수로 처리되는 경우 bl의 경우 233입니다.

도서 정보 ... 정말입니까? 신중하게 다시 읽어보십시오. 오타가 있어야합니다. 아니면 작은 세부 사항을 간과하고 있습니다.