Опять же - нельзя изменить глобальную переменную в C - PullRequest
0 голосов
/ 11 июля 2020

Я новичок в 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 были представлены точно так же, но это не сработало, как ожидалось

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...