x86相关内容

JRE 32 位与 64 位

我已经使用 Java 有一段时间了,我设置新开发机器的典型习惯要求从 Oracle 的站点下载和安装最新的 JDK. 今天提出了一个不寻常的问题,我使用 32 位或 64 位 JRE 包有关系吗? 回想起来,我之前已经安装了这两个版本,并且我的普通工具链愉快地插入 (Eclipse).在我的日常编程中,我不记得曾经因为我使用 64 位 JRE(或在这方面针对 64 位 JRE)而不得不 ..
发布时间:2022-01-06 13:13:27 Java开发

为什么 INC 和 DEC 指令*不*影响进位标志 (CF)?

为什么 x86 指令 INC(递增)和 DEC(递减)不会影响 FLAGSREGISTER 中的 CF(进位标志)? 解决方案 要了解为什么您可能需要记住当前具有 32 位和 64 位值的“x86"CPU 的生命周期与更有限的 8 位计算机一样,回溯到 Intel 8008.(我 1973 年在这个世界上编码,我仍然记得(呃)它!). 在那个世界中,寄存器既珍贵又小.您需要 INC/ ..
发布时间:2022-01-06 13:13:11 其他开发

R 在 RAX、RBX、RCX、RDX、RSI、RDI、RBP、RSP 中代表什么?

x86 汇编语言不得不改变,因为 x86 处理器架构已经从 8 位变为 16 位,再到 32 位和现在的 64 位. 我知道在 32 位汇编寄存器名称(EAX、EBX 等)中,每个名称的前缀 E 代表 Extended 表示寄存器的 32 位形式而不是 16 位形式(AX、BX 等).). 这些寄存器名称的 R 前缀在 64 位中代表什么? 解决方案 我认为它只是 R 代表“寄 ..
发布时间:2022-01-06 13:13:01 其他开发

push 和 pop 在装配中是如何工作的

我对 pop 在汇编中的实际作用感到困惑.pop 是否将最后一个 PUSH ed 的值移动到堆栈上(这意味着如果我们 MOV 在最后一个元素之后的一个值PUSHed) 或者它只是弹出堆栈中最后一个值(因此,适用于 MOV 和 PUSH),或者它是否弹出堆栈指针所指向的值是什么?考虑以下代码: push $4mov $5, -4(%esp)添加 $4, %esp (esp 指向一个未知值)弹出 % ..
发布时间:2022-01-06 13:12:51 其他开发

X 在 EAX、EBX、ECX 中是什么意思……在汇编中?

Google 不显示结果, 有人知道吗? 解决方案 X 表示 pair,至少可以追溯到 8080.它有 8 位寄存器 B、C、D、E、H、L(以及其他)也可以成对使用(BC、DE 和 HL).BC 和 DE 对主要用于 16 位算术;HL 对通常持有一个内存地址.X 用于 pair 的一些示例: LXI D,12ABH ;“立即加载对"DCX B ;“递减对"STAX D ;“以对 ..
发布时间:2022-01-06 13:12:42 其他开发

位置无关代码的区别:x86 vs x86-64

我最近正在构建一个针对 x86-64 架构的共享库 (ELF),如下所示: g++ -o binary.so -shared --no-undefined ... -lfoo -lbar 由于以下错误而失败: 重新定位R_X86_64_32针对`a local symbol'不能在制作共享对象时使用;用 -fPIC 重新编译 当然,这意味着我需要将其重新构建为与位置无关的代码,因此 ..
发布时间:2022-01-06 13:12:33 服务器开发

如何让 GCC 在没有内置函数的情况下为大端存储生成 bswap 指令?

更新:此问题已在 GCC 8.1 中修复. 我正在研究一个以大端格式将 64 位值存储到内存中的函数.我希望我可以编写可在小端和大端平台上运行的可移植 C99 代码,并让现代 x86 编译器自动生成 bswap 指令而无需任何内置或内在函数.所以我从以下功能开始: #include 空白encode_bigend_u64(uint64_t 值,void *vdest){uint8_t *b ..
发布时间:2022-01-06 13:12:13 其他开发

我的基于 AMD 的机器使用小端还是大端?

我正在学习计算机系统课程,并且我正在尝试确定,肯定,如果我的基于 AMD 的计算机是小端机器?我相信这是因为它将与英特尔兼容. 具体来说,我的处理器是 AMD 64 Athlon x2. 我知道这在 C 编程中很重要.我正在编写 C 程序,我正在使用的方法会受此影响.我想弄清楚如果我在基于 Intel 的机器上运行程序是否会得到相同的结果(假设是小端机器). 最后,让我问一下:任 ..
发布时间:2022-01-06 13:11:56 其他开发

试图理解 gcc 在复制返回地址的 main 顶部的复杂堆栈对齐

嗨,我已经反汇编了一些我写的程序(linux)以更好地理解它是如何工作的,我注意到主要功能总是以: lea ecx,[esp+0x4] ;我认为这是为了获得主要的第一个参数的地址......为什么?和 esp,0xffffffff0 ;???编译器是否试图在 16 个字节上对齐堆栈指针???push DWORD PTR [ecx-0x4] ;我知道汇编程序正在推动返回地址....为什么?推ebp ..
发布时间:2022-01-06 13:11:21 服务器开发

x86 页表如何工作?

我熟悉 MIPS 架构,它有一个软件管理的 TLB.因此,您(操作系统)希望如何以及在何处存储页表和页表条目完全取决于您.例如,我做了一个带有单个倒页表的项目;我看到其他人在每个进程中使用 2 级页表. 但是 x86 的故事是什么?据我所知,TLB 是硬件管理的.x86 是否告诉您,“嘿,这是您当前使用的页表条目需要去[物理地址范围] 的地方"?但是等等,我一直认为 x86 使用多级页表,所 ..

GCC 5.4.0 的昂贵跳跃

我有一个看起来像这样的函数(只显示重要的部分): double CompareShifted(const std::vector& l, const std::vector &curr, int shift, int shiftY) {...for(std::size_t i=std::max(0,-shift);i 这样写,这个函数在我的机器上用了大约 34 毫秒.将条件更改为 bool 乘 ..
发布时间:2022-01-06 13:10:48 C/C++开发

LEA EAX,[EAX] 有什么意义?

LEA EAX, [EAX] 我在用 Microsoft C 编译器编译的二进制文件中遇到了这条指令.它显然不能改变 EAX 的值.那为什么会在那里呢? 解决方案 这是一个NOP. 以下通常用作NOP.它们都做同样的事情,但它们导致不同长度的机器代码.根据对齐要求选择其中之一: xchg eax, eax = 90移动 eax, eax = 89 C0lea eax, [eax ..
发布时间:2022-01-06 13:10:42 其他开发

LEA 或 ADD 指令?

我在手写组装的时候,一般都会选择表格 lea eax, [eax+4] 在表格上.. 添加 eax, 4 我听说 lea 是一个“0 时钟"指令(如 NOP),而 'add' 不是.但是,当我查看编译器生成的程序集时,我经常看到使用后一种形式而不是第一种形式.我足够聪明,可以信任编译器,所以任何人都可以阐明哪个更好?哪个更快?为什么编译器会选择后者而不是前者? 解决方案 LEA 和 ..
发布时间:2022-01-06 13:10:28 其他开发

为 x86 架构开发操作系统

我计划为 x86 架构开发一个操作系统. 我有哪些编程语言可供选择? 有哪些类型的编译器可用,最好在 Windows 环境中使用? 是否有任何好的来源可以帮助我了解有关操作系统开发的更多信息? 是在虚拟机上还是在物理硬件上测试我的操作系统更好? 有什么建议吗? 解决方案 在我最后一年的拼贴项目中,我开发了一个带有虚拟内存管理器、虚拟文件系统和完全抢占式多任务处理的小型 x ..
发布时间:2022-01-06 13:10:08 其他开发

与 AT&T 相比,英特尔汇编语法的局限性

对我来说,英特尔语法更容易阅读.如果我只专注于 Intel 语法在组装森林中游荡,我会错过什么吗?我有什么理由想切换到 AT&T(除了能够阅读其他人的 AT&T 程序集)?我的第一个线索是 gdb 默认使用 AT&T. 如果这很重要,我的重点只放在任何可能与 Linux/BSD 和 C 语言相关的程序集和语法上. 解决方案 两者之间确实没有任何优势.我同意 Intel 语法 更容易阅 ..
发布时间:2022-01-06 13:09:59 服务器开发

CPU 特权环:为什么不使用环 1 和 2?

关于 x86 CPU 特权环的几个问题: 为什么大多数操作系统不使用环 1 和环 2?只是为了保持代码与其他架构的兼容性,还是有更好的理由? 是否有实际使用这些环的操作系统?或者它们完全没有使用? 解决方案 作为一个业余的操作系统编写者,我发现因为分页(现代保护模型的主要部分)只有特权(ring 0,1,2) 和非特权,环 1 和环 2 的收益大大减少. 英特尔采用环 1 ..
发布时间:2022-01-06 13:09:48 其他开发

如何解释 objdump 反汇编输出列?

我用 c 编写了一个简单的程序,它调用一个名为 while_loop 的函数,参数为 4,3,2.该函数基本上只是一个 while 循环,我认为它与我的问题并不真正相关,因为它更像是一个通用问题.有人告诉我运行 objdump -d,所以我做了. 我有多个问题,所以这里是: 我知道在最左边的列中有地址,它们根据前面的字节数递增.我不太明白的是第二列.它是正在执行的指令,但是是十六进制的 ..
发布时间:2022-01-06 13:09:30 其他开发

程序集:printf 不打印新行

我有以下代码打印传递给 ./main 的参数数量.注意 rodata 部分中的 fmt.我已经包含了新行 \n,就像在 C 中一样,但它没有打印新行,而是打印: 参数数量:1 \n 我的代码是: ;main.asm全球主要外部输出.rodata 节:fmt db "参数数量: %d \n", 0.text 部分:主要的:推ebpmov ebp, esp ;堆栈帧push dword[ ..
发布时间:2022-01-06 13:09:24 服务器开发

从内存加载寄存器时是否可以“中止"而不是触发页面错误?

我正在考虑“最小化页面“行走"大图时出现故障(和 TLB 故障)' '如何知道一个指针是否在物理内存中,否则会触发 Page Fault?' 是一个从另一面看问题的相关问题,但没有解决方案. 我希望能够将一些数据从内存加载到寄存器中,但如果内存当前已被分页,则加载会中止而不是出现页面错误.我需要代码在 Windows 和 Linux 上的用户空间中工作,而无需任何非标准权限. ( ..
发布时间:2022-01-06 13:09:13 其他开发