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
)? 이 문제의 다른 원인은 무엇입니까? 감사!
에서 & t 구문은 일반적으로 'movzx'를 사용하지 않지만 일부 어셈블러 버전에서는이를 허용합니다. 그것을 'movzbl 240 (% r10), % eax' (바이트 소스라고 가정)로 변경해보십시오. – Jester
또는 아마도'movzbq 240 (% r10), % rax'. – fuz
@FUZxxl은 자동 제로 확장으로 인해 과잉 공격이되지만 작동해야합니다. 기록을 위해, 내 어셈블러 (_GNU 어셈블러 2.22_)도 원래 'movzx'를 사용합니다. OSX 버전은 그렇지 않을 수도 있습니다. – Jester