즉시, 음수 돌아 내가 86 자신을 가르치려고 노력하고있어, 나는 필요에 걸쳐 실행했습니다 :이 기능 (printf("%" PRIdPTR "\n", scheme_entry())
의 반환 값을 인쇄 할 때x86에서 즉시 64 비트 음수를 인코딩 할 수 있습니까?
.text
.align 4,0x90
.globl _scheme_entry
_scheme_entry:
movl $-42, %eax
ret
를, 내가 얻을 말도 안되는 번호 : 대신 64 비트의, 부정적인 00000000FFFFFFFF 32 비트 부정적이기 때문에
$ ./neg
4294967254
나는이 같은데요은 FFFFFFFFFFFFFFFF입니다
내가 상수 64 비트 값을 저장할 수있는 방법. 어셈블러 기능에서 직접 에? 두 가지 별도의 지침으로 인코딩해야합니까?
잘못 인쇄하지 않으셨습니까? 'scheme_entry'는 32 비트 정수를 반환하는 것 같습니다 (그렇지 않다면'eax'에 넣는 이유는 무엇입니까?) – harold
gcc는 함수 엔트리 포인트를 16 바이트로 정렬합니다. 덧붙여 패딩이 1 바이트 NOP (절대 실행되지 않기 때문에)가되도록하는 이유도 없습니다. '.p2align 4'를 사용하여'1 << 4'로 정렬하십시오. (아주 작은 함수의 경우 8 바이트 경계가 전체 함수를 포함하므로'.p2align 3'을 사용할 수 있습니다.) 최신 CPU는 오래된 CPU와 같이 코드 정렬에 민감하지 않지만 일반적으로 NOP 패딩은 실행되지 않습니다. –
@PeterCordes 꽤 많이 그게 내 머리 위로있다. 나는 [컴파일러 작성 튜토리얼] (http://scheme2006.cs.uchicago.edu/11-ghuloum.pdf)을 따라 가며 의도적으로 우리를 아주 작은 C 입력에 대해 gcc 출력을 사용하여 컴파일러에서 무엇을 방출할지 결정하십시오. 위의 상용구는 기본적으로 축 어적으로 복사되었지만 나는 그것이 무엇을하는지 아직 알지 못했습니다! : x – ELLIOTTCABLE