Задать вопрос
@nnGot583
c#, iOS дизассемблирование

Не выходит прибавить значение нужное значение к переменной в C?

здравствуйте, нужно исправить неверное прибавление значений к указателям в C.
Такой код я сделал для демонстрации проблемы

int a = 0;
    DWORD_PRINT((int)&a); // все хорошо
    DWORD_PRINT((int)(&a + 0x4400)); // прибалось 0х11000
    DWORD_PRINT((int)(&a + 0x440)); // прибалось 0х1100

    int b = 0x1000;
    DWORD_PRINT((int)&b); // все хорошо
    b += 0x1000;
    DWORD_PRINT(b); // все хорошо

    int c = (int)&b;
    c += 0x1000;
    DWORD_PRINT(c); // все хорошо
// функция просто DWORD_PRINT выводит переданное 4 байтовое значение



Этот код компилируется вот так:


по адресу 0х4а явно видно прибавление неверного значения к регистру

679b87647d303861611818.png
Вставляю этот же ассемблер текстом:
0x00000031 mov dword [var_10h], 0
0x00000038 lea eax, [var_10h]
0x0000003b sub esp, 0xc
0x0000003e push rax
0x0000003f call fcn.000000c0 ; fcn.000000c0
0x00000044 add esp, 0x10
0x00000047 lea eax, [var_10h]
0x0000004a add eax, 0x11000
0x0000004f sub esp, 0xc
0x00000052 push rax
0x00000053 call fcn.000000c0 ; fcn.000000c0
0x00000058 add esp, 0x10
0x0000005b lea eax, [var_10h]
0x0000005e add eax, 0x1100
0x00000063 sub esp, 0xc
0x00000066 push rax
0x00000067 call fcn.000000c0 ; fcn.000000c0
0x0000006c add esp, 0x10
0x0000006f mov dword [var_14h], 0x1000
0x00000076 lea eax, [var_14h]
0x00000079 sub esp, 0xc
0x0000007c push rax
0x0000007d call fcn.000000c0 ; fcn.000000c0
0x00000082 add esp, 0x10
0x00000085 mov eax, dword [var_14h]
0x00000088 add eax, 0x1000
0x0000008d mov dword [var_14h], eax
0x00000090 mov eax, dword [var_14h]
0x00000093 sub esp, 0xc
0x00000096 push rax
0x00000097 call fcn.000000c0 ; fcn.000000c0
0x0000009c add esp, 0x10
0x0000009f lea eax, [var_14h]
0x000000a2 mov dword [var_ch], eax
0x000000a5 add dword [var_ch], 0x1000
0x000000ac sub esp, 0xc
0x000000af push qword [var_ch]
0x000000b2 call fcn.000000c0 ; fcn.000000c0
0x000000b7 add esp, 0x10

я запускал этот код на qemu в своем ядре и получил такой вывод

679b8b961cfe1404773214.png
(каждому выводу соответствует вызов функции dword print кроме "?" в конце)

компилирую

x86_64-elf-gcc -m32 -ffreestanding -c kernel.c -o kernel.o
ld.lld -T linker.ld -o kernel --oformat binary kernel.o

Эта проблема возникает когда я работаю с указателями - или прибавляю что-то к нему как к переменной или добавляю к нему при передаче в функции. совсем недавно вместо прибавления 0х11000 было 0x44000 (когда должно было быть 0х4400), тоже не знаю почему
  • Вопрос задан
  • 96 просмотров
Подписаться 2 Простой 7 комментариев
Пригласить эксперта
Ответы на вопрос 1
@nnGot583 Автор вопроса
c#, iOS дизассемблирование
вместо DWORD_PRINT((int)(&a + 0x4400))
нужно DWORD_PRINT((int)&a + 0x4400)
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы