을 가끔 뭔가의 배열을 반복하는이 패턴을 사용제대로 조건을 테스트하는 방법 : JE 또는 jge
mov [rsp+.r12], r12 ; Choose a register that calls inside the loop won't modify
mov r12, -1
.i:
inc r12
cmp r12, [rbp-.array_size]
je .end_i
; ... program logic ...
jmp .i
.end_i:
mov r12, [rsp+.r12]
나는 평등을 테스트하기에 충분하지만, 이해해야한다 "에 대한없는 일"안전하게 "테스트 보다 크거나 같음 "(발생하지 않을 상황을 방지하십시오).
이 경우 je 또는 jge를 사용해야합니까?
버그를 도입 할 가능성을 줄일 수있는 구체적인 팁을 묻습니다.
저는 평상시가 아닌 우연히 범위를 테스트하는 아이디어가 좋았습니다. 실수로 비트가 넘칠 경우를 대비해서 말이죠. 그러나 x86 asm에서,'cmp/jge'는 Core2 (32 비트 모드)에서 매크로 퓨즈 할 수 없지만'cmp/je'는 할 수 있다는 것을 명심하십시오. 나는 Core2에서 64 비트 모드로 매크로 융합이 전혀 작동하지 않기 때문에 그것이 확인 될 때까지 더 관련성이 높을 것이라고 생각했고, 그것이 Nehalem이 아니라 Core2만이 융합 될 수 있다는 것을 발견했습니다. (나중에 마이크로 아키텍처는 그 한계가 없기 때문에 더 많은 조합을 매크로 퓨즈 할 수 있습니다.) –
왜 임시 카운터로 사용하기 위해 r12의 이상한 유출/재로드를 보여 줍니까? 그건 전혀 상관 없습니다 (효율적인 코드처럼 보이지는 않습니다). 이미 저장하지 않고 사용할 수있는 이미 등록 된 레지스터가 있습니다. –
@ 피터, 어떻게 제대로 작성해야하나요? printf와 같은 루프 내부의 함수 호출은 호출 저장 r12 레지스터를 수정하지 않으므로 r12를 사용하는 것이 좋습니다. 따라서 호출을 수동으로 저장하고 호출을 복원 할 필요가 없습니다.잘못 되었다면 수정하십시오. –