ASSEMBLY] unsigned, signed jump

노션으로 옮김·2020년 4월 12일
1

Study

목록 보기
16/33
post-thumbnail

개요

포너블 문제를 푸는 도중에 다음과 같은 코드를 만났다.

signed 연산을 이용해 -1과 같은 음수 값을 입력하면 해당 조건문으로 분기하여 invalid choice를 우회하지만, 값을 사용할 때는 unsigned로 계산되어 실제 num은 관리자가 의도하지 않은 큰 값을 갖게되는 그런 시나리오를 생각했다.
하지만 결과는 invalid choid가 출력되었다.

찾아서 확인해보니, 어셈블리언어의 분기문도 signed unsigned 속성을 가지고 있었다.


분류

따로 정리할 것은 없고 스택오버플로우 글을 참고하면 될 것 같다.

+--------+------------------------------+-------------+--------------------+
|Instr | Description | signed-ness | Flags |
+--------+------------------------------+-------------+--------------------+
| JO | Jump if overflow | | OF = 1 |
+--------+------------------------------+-------------+--------------------+
| JNO | Jump if not overflow | | OF = 0 |
+--------+------------------------------+-------------+--------------------+
| JS | Jump if sign | | SF = 1 |
+--------+------------------------------+-------------+--------------------+
| JNS | Jump if not sign | | SF = 0 |
+--------+------------------------------+-------------+--------------------+
| JE/ | Jump if equal | | ZF = 1 |
| JZ | Jump if zero | | |
+--------+------------------------------+-------------+--------------------+
| JNE/ | Jump if not equal | | ZF = 0 |
| JNZ | Jump if not zero | | |
+--------+------------------------------+-------------+--------------------+
| JP/ | Jump if parity | | PF = 1 |
| JPE | Jump if parity even | | |
+--------+------------------------------+-------------+--------------------+
| JNP/ | Jump if no parity | | PF = 0 |
| JPO | Jump if parity odd | | |
+--------+------------------------------+-------------+--------------------+
| JCXZ/ | Jump if CX is zero | | CX = 0 |
| JECXZ | Jump if ECX is zero | | ECX = 0 |
+--------+------------------------------+-------------+--------------------+

Then the unsigned ones:
+--------+------------------------------+-------------+--------------------+
|Instr | Description | signed-ness | Flags |
+--------+------------------------------+-------------+--------------------+
| JB/ | Jump if below | unsigned | CF = 1 |
| JNAE/ | Jump if not above or equal | | |
| JC | Jump if carry | | |
+--------+------------------------------+-------------+--------------------+
| JNB/ | Jump if not below | unsigned | CF = 0 |
| JAE/ | Jump if above or equal | | |
| JNC | Jump if not carry | | |
+--------+------------------------------+-------------+--------------------+
| JBE/ | Jump if below or equal | unsigned | CF = 1 or ZF = 1 |
| JNA | Jump if not above | | |
+--------+------------------------------+-------------+--------------------+
| JA/ | Jump if above | unsigned | CF = 0 and ZF = 0 |
| JNBE | Jump if not below or equal | | |
+--------+------------------------------+-------------+--------------------+

And, finally, the signed ones:
+--------+------------------------------+-------------+--------------------+
|Instr | Description | signed-ness | Flags |
+--------+------------------------------+-------------+--------------------+
| JL/ | Jump if less | signed | SF <> OF |
| JNGE | Jump if not greater or equal | | |
+--------+------------------------------+-------------+--------------------+
| JGE/ | Jump if greater or equal | signed | SF = OF |
| JNL | Jump if not less | | |
+--------+------------------------------+-------------+--------------------+
| JLE/ | Jump if less or equal | signed | ZF = 1 or SF <> OF |
| JNG | Jump if not greater | | |
+--------+------------------------------+-------------+--------------------+
| JG/ | Jump if greater | signed | ZF = 0 and SF = OF |
| JNLE | Jump if not less or equal | | |
+--------+------------------------------+-------------+--------------------+


실습

그렇다면 언제 signed unsigned가 각각 사용되는지 궁금했다.
간단히 C언어 프로그램을 작성하여 확인했다.

결론부터 말하면 C언어와 동일하게 설정된다.
비교값을 unsigned로 캐스팅하면 어셈블리언어의 점프문으로 unsigned가 사용된다.

unsigned

#include <stdio.h>

int main(){
        int a = -2;
        if((unsigned int)a < (unsigned int)4)
                printf("bobobobobobobobobob\n");
}

디버깅

signed

#include <stdio.h>

int main(){
        int a = -2;
        if(a < 4)
                printf("bobobobobobobobobob\n");
}

디버깅


참조

https://stackoverflow.com/questions/9617877/assembly-jg-jnle-jl-jnge-after-cmp

0개의 댓글