cpu-registers

    2热度

    1回答

    我最近偶然发现了一个我不明白的有趣的编译器代码。 看看下面的代码: unsigned char x; ... x |= 127; x |= 128; 对于第一条语句,编译器生成: or eax, 0x7f. 然而,在第二条语句,就变成: or eax, 0xffffff80 似乎对值小于127,则使用一个字节值,而在128个dword之后是优选的。 有没有人知道为什么会发生这种情

    0热度

    1回答

    当堆栈指针移回原来的位置时,会发生什么情况,但保存在堆栈中的值没有从内存加载到寄存器文件中?即当堆栈指针移回时,值仍然存在于堆栈内存中。

    5热度

    1回答

    我遇到的所有CPU架构都有对称寄存器 - 即您读取的值是您写入的值。 对于寄存器限制的16位指令,是否存在具有不对称寄存器的情况? 例如 寄存器0-6对函数调用是“本地”的。写入该函数调用的值是将要读取的值。每个函数调用级别都有自己的寄存器硬件,所以本地寄存器被隐式保存。 寄存器7-9是“全局”的,也许是SMP CPU上的“线程本地”。 写入“调用”寄存器10-13的值不影响在此函数调用上下文中从

    3热度

    1回答

    32位寄存器名称以E开头,64位以R开头。E和R代表什么意思?有没有选择这些字母的理由?另外,在64位寄存器中,我们也可以在任何低级别调试器(例如Windbg)中看到最右边的位仍被称为与64位寄存器相同的名称,除了名称以E开头。例如64位系统中RAX寄存器的最右侧32位称为EAX。 那么,E和R代表什么?还有,为什么后缀X用于注册?

    -3热度

    2回答

    如果在eax中有一个char数组的地址,那么0(%eax)和(%eax)之间的区别是什么?或者它们是相同的,都是指数组中的第一个元素?

    0热度

    1回答

    对于汇编器我很新,我只需要完成我的学校任务,但是我有一个小问题。程序应该读取输入的两位数字,并计算所有大于第一个数字的数字。问题是寄存器EDX(用于计数更大的数字)增加到1,但不超过它。你能提出一些不太复杂的东西吗? %include "asm_io.inc" segment .data char_prompt db "Insert numbers: ",0 comma db ", ",

    1热度

    1回答

    我有以下装配命令: mov eax, 10001 mov [eax], DEADCODEh 我所知道的是 我说的是X86 EAX有32位 我要保持小尾数记住 那么内存是怎么样的呢? 整个十六进制数是否存储在10001或只有一部分? 取决于那些地址10002,10003和10004是怎么样的?

    -1热度

    1回答

    我正试图在C中编写一个简单的软CPU,该CPU将用于嵌入式应用程序的假想机器上。我对此很陌生,所以请耐心等待。 我一直想在IDE中做到这一点,但遇到一个问题,我需要malloc的内存,并没有获得一致的内存地址分配我的寄存器,所以我无法运行测试和调试。在一个实际的硬件上,我知道文档会给我特定的寄存器,主内存和硬盘内存的地址,对吗?我希望能够为我的寄存器定义宏,然后我可以将它们传递给读/写,但是如果没

    0热度

    1回答

    我正在使用SHL/SHR以将寄存器中的数字减半。它对于正数和负数都可以正常工作。然而,有些东西正在扰乱我对负数的看法。 我去之前,我应该说我知道的SAR和SAL转移符号二进制,但我需要使用SHL/SHR明确。 (我尝试了SAR和SAL和那些工作很好 - 但我不能使用那些) 所以就这个问题。 如果我有一个数字,让我们说-5,这是存储在寄存器中的“FFFFFFFB”。 但是,当我SHR它(将它减半)它

    0热度

    1回答

    下面的函数打印出UART寄存器的内容。这是注册地图。 uart registers 有人能解释为什么,在+=4 for循环上升? 谢谢 #define UART0_BASE 0x21000 void print_uart(unsigned int base) { int i; int val; unsigned int adr; for (i=0; i< 0x18; i+=4