은 레지스터 오퍼랜드의 폭은, 상기 메모리 연산의 폭을 의미한다. 예 : mov rdx, [d]
은 사용자가 64 비트 레지스터를 사용했기 때문에 mov rdx, qword [d]
을 의미합니다.
그러나 같은 movsx
/movzx
니모닉 바이트 소스와 단어 소스 옵 코드에 사용되는, 그래서 소스가 레지스터 (같은이 movzx eax, cl
) 경우를 제외하고는 모호합니다.
movsx
/movzx
메모리 소스는 항상 명시 적으로 지정된 메모리 피연산자의 너비가 필요합니다.
니모닉은 32 비트 원본 크기를 나타냅니다. movsxd rcx, [c]
은 NASM과 조립되지만 YASM에서는 분명히 조립되지 않습니다. byte
, word
또는 qword
을 허용하지 않으며 movsx rcx, dword [c]
을 수락하지 않더라도 (즉, 32 비트 소스 피연산자에 대해서는 movsxd
니모닉이 필요합니다) YASM은 dword
을 작성해야합니다.
NASM에서 movsx rcx, dword [c]
은 movsxd
으로 어셈블되지만, movsxd rcx, word [c]
은 여전히 거부됩니다. 즉 NASM에서 일반 movsx
은 완전히 유연하지만 movsxd
은 여전히 견고합니다. 부하의 폭을 사람의 이익을 위해 명시 적으로 만들려면 dword
을 사용하는 것이 좋습니다. 대상의 폭이
movsx rax, byte [a]
movsx rbx, word [b]
movsxd rcx, dword [c]
참고 명령어의 "오퍼랜드 크기"(피연산자 크기 접두사에 의해 결정은 16 비트 확인하거나 REX.W = 1은 64 비트를 만들기 위해) 것을 movsx
/movzx
입니다. 소스 크기가 다르면 다른 opcode를 사용합니다. 경우
그것은 분명하지, 32-bit mov
already zero-extends to 64-bit implicitly 때문에 더 movzxd
없다입니다. movsxd eax, ecx
은 인코딩 할 수 있지만 권장되지는 않습니다 (대신 mov
을 사용하십시오).
T 문법에서 다른 소스 - 너비는 movsb
또는 movsw
과 같이 다른 니모닉을가집니다. 대상 크기는 평소와 같이 접미사이므로 명시 적으로 movsbq (%rsi), %rax
을 작성하거나 %rax
에서 대상 크기를 유추 할 수 있도록 movsb (%rsi), %rax
을 작성할 수 있습니다. 소스 코드에 대한
다른 물건 :
NASM/YASM는 대신 section
의 segment
키워드를 사용하는 것을 허용하지만, 정말 당신은 ELF 섹션 이름이 아니라 실행 세그먼트 이름을 제공하고 있습니다. 또한 읽기 전용 데이터는 section .rodata
(텍스트 세그먼트의 일부로 연결됨)에 넣을 수 있습니다. What's the difference of section and segment in ELF file format.
ret
부터 _start
까지는 입력 할 수 없습니다. 기능이 아닙니다. ELF 진입 점입니다.스택의 첫 번째 것은 유효한 반환 주소가 아닌 argc
입니다. 정상적으로 종료 할 때 사용 :
xor edi,edi
mov eax, 231
syscall ; sys_exit_group(0)
링크에 더 유용한 가이드 (그리고 하단에 디버깅 팁)의 x86 태그 위키를 참조하십시오.
크기를 지정해야합니다. 'movsx rax, byte [a]' – Jester
당신이 내 문제를 해결했다면, 원하면 대답으로 게시해야합니다. –