Записать регистры данных в массив, используя asm C - PullRequest
0 голосов
/ 08 апреля 2020

Я создал программу, которая записывает данные регистров в переменные, используя asm. И, похоже, работает хорошо. Но затем я решил заменить переменные массивом и записать данные регистров в массив. Я использовал тот же подход, но заметил, что когда я печатаю переменные и элементы массива, они имеют разные значения, но должны иметь одинаковые значения. Что я делаю неправильно, пытаясь записать значения регистров в массив? Как я понимаю, это должно работать так же, если записать в автономную переменную.

void read_registers(void)
{
    int ebx_val, ecx_val, edx_val;
    char reg_name[4][4] = {"ebx", "ecx", "edx"};
    int reg_val[3];

    printk("\n===OLD VALUES BELOW===");
    test_syscall();/*inside of the syscall registers were written 0xDEADBEEF*/
    __asm__ volatile (
            "\t movl %%ebx,%0" : "=r"(ebx_val));
    __asm__ volatile (
            "\t movl %%ecx,%0" : "=r"(ecx_val));
    __asm__ volatile (
            "\t movl %%edx,%0" : "=r"(edx_val));

    printk("\nReg ebx val user mode 0x%x\n", ebx_val);
    printk("\nReg ecx val user mode 0x%x\n", ecx_val);
    printk("\nReg edx val user mode 0x%x\n", edx_val);

    printk("\n===NEW VALUES BELOW===");

    __asm__ volatile (
            "\t movl %%ebx,%0" : "=r"(reg_val[0]));
    __asm__ volatile (
            "\t movl %%ecx,%0" : "=r"(reg_val[1]));
    __asm__ volatile (
            "\t movl %%edx,%0" : "=r"(reg_val[2]));
    for(int i=0; i<3; i++)
    {
    printk("\nReg %s val is 0x%x\n", reg_name + i,
            reg_val[i]);
    }
...