2016-11-21 2 views
1

전역 변수를로드하고 -1과 같지 않은지 확인하지만 내 코드는 -1과 같다고 인식하지 않습니다. 지역 변수와의 비교 만 통과합니다.암 어셈블리의 부호있는 정수

//setting global variable 
    .data 
    .global top_m 
    top_m: .word -1 

//loading global variable into x21 
adrp x28, top_m 
add x28, x28, :lo12:top_m 
ldr x21, [x28] 

//checking value of global variable, it does not branch to exit_stackEmpty 
cmp  x21, -1 
b.eq exit_stackEmpty 

//but if I compare with a local variable then it does branch 
mov x23, -1 
cmp  x23, -1 
b.eq exit_stackEmpty 

편집 : 그것은 X21 및 X23

x21 0xffffffff  4294967295 //after loading -1 to x21 
x23 0xffffffffffffffff  -1 //after mov x23, -1 
+1

'.word'의 크기가 얼마나 큽니까, 즉 서명 된 64 비트 값을로드하는 것입니까? – Notlikethat

답변

2

.word 지침에서, 따라서 32 비트 당신이로드하는 데이터에 대해이 작업을 보여줍니다 GDB에서 - 0xffffffff를. 그 주소에서 64 비트를로드하면 0x00000000ffffffff가됩니다. 실제로 64 비트 -1이 아닙니다. 덧붙여 말하자면, 그로드 또한 데이터 섹션의 마지막 부분에서 벗어난다. 나쁜 아이디어이지만, MSB (또는 segfault)에서 0을 얻는다는 것을 의미한다. 만약 당신이 top_m 다음에 더 많은 데이터를 가지고 있다면 그것은 더 확실한 일이 일어나고 있습니다.

32 비트 단어를로드하고 64 비트로 부호 확장하려면 "32 비트 단어로드 및 64 비트 부호 확장"명령어 인 LDRSW을 사용하십시오.

관련 문제