조건부로 0을 레지스터로 이동 하시겠습니까?

Dec 01 2020

어셈블리의 레지스터로 0을 조건부로 이동하는 방법이 있습니까? 나는하려고

cmpb %r9b, %r8b #compare r9 and r8
cmovgq $0, %rcx #If r8>r9, move zero to rcx

그러나 컴파일러는 첫 번째 피연산자가 즉각적인 상수라는 사실 때문에 "cmovg에 대한 피연산자 유형 불일치"에 대해 불평하고 있습니다. 나는 mov 로의 조건부 점프에 대해 생각했지만 더 나은 다른 opcode가 있는지 확실하지 않습니다. 다른 레지스터를 먹지 않고 어떻게이 레지스터를 조건부로 제로화 할 수 있습니까?

답변

dannyadam Dec 01 2020 at 03:36

cmovgq명령어가 즉치 피연산자를 허용하지 않기 때문에 다른 레지스터를 사용하지 않는 방법은 스택에 0 값을 추가하고 즉치 값을 사용하는 대신 해당 주소를 사용한 다음 스택 포인터를 복원하는 것입니다.

pushq   $0 # push 0 onto the stack cmpb %r9b, %r8b # compare r9b and r8b cmovgq (%rsp), %rcx # if r8b > r9b, move zero to rcx addq $8,     %rsp  # restore stack pointer

또는 0을 스택에 푸시 한 다음 스택 포인터를 복원하는 대신 0 값을 메모리의 다른 곳에 저장할 수 있습니다.

  cmpb    %r9b, %r8b  # compare r9b and r8b
  cmovgq  zero, %rcx  # if r8b > r9b, move zero to rcx
  ...

  .section .rodata
zero:
  .quad 0

를 사용하는 대신 cmovgq조건부 점프는 다른 레지스터를 사용하지 않고 동일한 동작 (즉, rcx조건부로 0으로 설정)을 발생시키는 대체 접근 방식입니다 r8b > r9b.

  cmpb    %r9b, %r8b   # compare r9 and r8
  jle     destination  # if r8b <= r9b, skip the next line
  movq    $0, %rcx     # if r8b > r9b, move zero to rcx
destination:
  ...