Я новичок в ie в C, и этот вопрос можно было задать 100 раз, но я не могу найти такой же случай. Вот код:
int r;
void set_idt() {
r = 0x88;
if(r == 0){
kprint_hex_byte(0xff);
}
}
Странно, но я не могу изменить глобальную переменную, и запускается kprint_hex_byte . Когда я пытаюсь выбрать & r внутри set_idt () , я получаю действительный адрес, но присвоение переменной не работает!
UPDATE
Я решил предоставить минимальный пример Вот минимизированный код:
int r = 0x34def;
void main(){
r = 0x33;
char d = 0;
if(r == 0){
d = 1;
}
else{
d = 2;
}
}
Я пытаюсь скомпилировать и разобрать его, используя следующие команды:
gcc -ffreestanding -fno-asynchronous-unwind-tables -fno-pie -m32 -c kernel.c -o kernel.o
ld -o kernel.bin -m elf_i386 --oformat binary kernel.o
ndisasm -b 32 kernel.bin > kernel.dis
Итак, в результате этих операций у меня нет никаких намеков на то, что любая переменная r или адресное пространство инициализируется как 0x34def. Вот код .dis:
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 83EC10 sub esp,byte +0x10
00000006 C7052C9004083300 mov dword [dword 0x804902c],0x33
-0000
00000010 C645FF00 mov byte [ebp-0x1],0x0
00000014 A12C900408 mov eax,[0x804902c]
00000019 85C0 test eax,eax
0000001B 7506 jnz 0x23
0000001D C645FF01 mov byte [ebp-0x1],0x1
00000021 EB04 jmp short 0x27
00000023 C645FF02 mov byte [ebp-0x1],0x2
00000027 90 nop
00000028 C9 leave
00000029 C3 ret
PS В исходном примере, когда я пытался его разобрать, у меня также были некоторые инструкции ассемблера, касающиеся ожидаемого адреса памяти и команд test и jnz были представлены точно так же, но это не сработало, как ожидалось