2016-10-24 11 views
1

AES의 어셈블러 기반 구현을 컴파일하려고합니다. 볼 수있는 here입니다. 내 어셈블러는 나에게 다음과 같은 오류를 주며, 동일한 오류의 인스턴스로 보이는 것보다 여러 번 반복됩니다. 정확한 소스 위치는 here이지만, 때문에이 파일에 사용되는 처리기 간접의 많은 양으로, 나는 컴파일러와 같이 정확한 코드를 제공 내 빌드 출력에서 ​​정확한 오류를 복사 한 :레지스터에 MOVXZ - "잘못된 명령어 피연산자"

/Volumes/Sources/Andromeda/Kernel/libkern/crypto/aes/EncryptDecrypt.s:297:19: error: invalid operand for instruction 
movzx 240(%r10), %rax 
        ^~~~ 

나는이 문제의 원인이 무엇인지 이해하지 못한다. 내가 제대로 이해한다면,이 명령어는 RAX 레지스터에 바이트 (또는 그 이상, 불분명하며 사실 문제의 원천이 될 수도 있음)를 옮기고, 소스가 64 비트보다 작 으면 0으로 확장한다 . movxz 설명에 태그를 추가하여 명시 적으로 크기를 지정해야합니까 (예 : movzxb)? 이 문제의 다른 원인은 무엇입니까? 감사!

+0

에서 & t 구문은 일반적으로 'movzx'를 사용하지 않지만 일부 어셈블러 버전에서는이를 허용합니다. 그것을 'movzbl 240 (% r10), % eax' (바이트 소스라고 가정)로 변경해보십시오. – Jester

+0

또는 아마도'movzbq 240 (% r10), % rax'. – fuz

+2

@FUZxxl은 자동 제로 확장으로 인해 과잉 공격이되지만 작동해야합니다. 기록을 위해, 내 어셈블러 (_GNU 어셈블러 2.22_)도 원래 'movzx'를 사용합니다. OSX 버전은 그렇지 않을 수도 있습니다. – Jester

답변

2

&에서 구문은 일반적으로 movzx을 사용하지 않지만 일부 어셈블러 버전에서는이를 허용합니다. 내 GNU 어셈블러 2.22 사본은 가능하지만 OSX 버전은 그렇지 않습니다. 어쨌든 어셈블러는 바이트 소스에 대한 코드를 생성합니다. 실제로 가지고있는 경우 & 구문이 movzbq 240(%r10), %rax이거나 자동 0 확장을 사용하면 movzbl 240(%r10), %eax이됩니다.

소스가 4 바이트 인 경우 해당 피연산자 유형에는 존재하지 않으므로 movzx을 전혀 사용할 수 없습니다. 이 경우 필요한 것은 자동 제로 확장이므로 모두 movl 240(%r10), %eax으로 간단히 수행 할 수 있습니다.