2013-04-25 2 views
1

저는 x86 어셈블러가 처음이고 모든 조건부 점프 및 테스트를 올바르게 해석하는 데 어려움이 있습니다. 이 코드를 다음 sbb 전에 CF 설정 여부, 그래서 sbb dx, dx의 결과가 당신이 가진 것을 하나 -1 dx에서 0입니다 중 하나 이것은 내가 그 코드를 읽는 방법입니다Assembly - TEST dx, dx, jg 다음에

sbb  dx, dx 
test dx, dx 
jg  short loc_17C7 

.

그러나 그렇다면 test dx, dxjg을 점프하게 만드는 FLAGS 조합으로 이어지지 않습니다. 위키 백과는 말합니다

TEST 연산은 플래그 CF와 OF를 0으로 설정합니다. SF는 AND의 결과의 MSB로 설정됩니다. 상기의 결과를 AND가 0 인 상기 ZF가 1로 설정되고, 그렇지 않으면 OF=0 SF=1 ZF=0이 (-1 이진 모두 1이어야 이어질 것이라고 0

dx -1이면 설정되므로 MSB는 OF=0 SF=0 ZF=1

그러나 jgZF=0 and SF=OF IFF에 점프로 이어질 것

dx가 0 인 경우) 따라서, SF = 1 : 1이어야합니다. 경우 1, SF!=OF. 케이스 2의 경우, ZF!=0.

그래서 내가 무엇을 놓치고 있습니까?

+0

나는 귀하의 결론이 정확하다고 믿습니다. 'JGE'는 의미가있다. 'JZ'는 의미가 있습니다. "JC"가 아닌 3 가지 명령어 모두가 더 이해하기 쉽습니다. (또는이 명령어의 역수 - 어쨌든 작동하지 않는 코드에 대해서는 쓸데없는 것입니다.) - 'jg'다음 명령어에 대한 명확한 방법은 없습니다. 아마도'loc_17c7'라고 라벨이 붙어 있을까요? – Magoo

답변

1

당신은 아무것도 놓치지 않았습니다.

이 코드는 최적화되지 않은 (적어도이 경우에는) 컴파일러에서 생성되었을 수 있습니다.

SBB에 있지도 여기에 문제가 않습니다

test dx, dx 
jg  short loc_17C7 

물론, 값 자체보다 클 수 없다.

+2

sbb DOES는 중요하지 않습니다. 존재하지 않는다면'dx'의 값은 0이나 -1이 아닌 다른 값일 수 있습니다; 그 브랜치는 양의 0이 아닌 값이면 취해질 것입니다. –

+0

@ChrisDodd (& Simon) : 나쁘다 - 나는'test'를'cmp'와 섞었다. 후자는 'sub'와 같은 플래그를 설정하지만 값을 보존합니다. 'test' OTOH는'and'와 동일하지만 값을 유지합니다. –

관련 문제