2014-01-29 1 views
8

난 콜에 대한 다음의 정의를 판독 하였다 : 그것은 광고가 cmpq $-4095 %rax %의 RAX는 -4095 -1 사이의 값을 포함하는지 여부를 결정하는 것이 반드시 설명cmpq 명령은 무엇을합니까?

.text 
.globl syscall 
.type syscall,%function 
.align 16 
syscall: 
    movq %rdi, %rax  /* Syscall number -> rax. */ 
    movq %rsi, %rdi  /* shift arg1 - arg5. */ 
    movq %rdx, %rsi 
    movq %rcx, %rdx 
    movq %r8, %r10 
    movq %r9, %r8 
    movq 8(%rsp),%r9 /* arg6 is on the stack. */ 
    syscall   /* Do the system call. */ 
    cmpq $-4095, %rax /* Check %rax for error. */ 
    jae __syscall_error  /* Branch forward if it failed. */ 
    ret   /* Return to caller. */ 

.size syscall,.-syscall 

. 어떻게 그럴 수 있죠? cmpq 명령은 정확히 무엇을합니까?

답변

11

cmpq $-4095, %rax은 64 비트 레지스터 % rax와 즉시 값 -4095을 비교합니다.이 값은 비교를 위해 64 비트로 부호 확장됩니다. - '초'와 '처음'반전되고 그것이 sub이 (빼기) 할뿐만 ffff ffff ffff f001

cmp 지침은 플래그 레지스터 세트 두 번째 피연산자의 첫 번째에서 : 즉, -4095는 64 비트 2의 보수 표현이있다 AT & T 구문입니다. 결과적으로 플래그는 (RAX - (- 4095)) 또는 (RAX + 4095)의 결과에 따라 설정되며 2의 보수가 동일합니다.

플래그 세트 중 하나는 carry 플래그 (CF)이며, 이는 부호없는 오버 플로우로 설정됩니다. jae 명령어 (jump-if-above-or-equal)는 실제로 jnc (이동하지 않는 경우 건너 뛰기)의 '별칭'입니다. 즉, (RAX + 4095)이 아니고이 아닌 경우 분기가 수행됩니다. 2의 보수로,이 값은 범위 [-4095, -1]에있는 RAX의 값에 적용됩니다. (2의 보수 산술이 어떻게 감싸는 지 기억하십시오.) Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 2 : cmpjae 및 (또는 j<cond>)를 포함


지시가 설명된다.

Intel® 64 and IA-32 Architectures Software Developer’s Manual, Volume 1의 3.4.3 절에 [E] FLAGS 레지스터 (그리고 산술 플래그가 나타내는 것)가 설명되어 있습니다.