X86 我在考试中是怎么做到的:)数数按键的次数

我在今天的考试中得到了这个问题,我为它写了一些代码。我想让你告诉我哪里出了错 问题:对于8086微处理器,编写执行以下任务的代码。它要求用户输入数据并统计按键次数。 在执行ALP时,获得第一条消息“计数按键,按escape停止”。(无引号),如果用户进入escape,则显示第二条消息“计数按键”,计数结果存储在BX中,并以二进制显示。此外,按下键(输入数据时),输入键应在下一行中回响 解决方案:(我写的) .model-tiny .数据 text1 db“计数按键,按escape停止$” tex

X86 使用Intel AVX存储压缩双精度向量中的单个双精度

我正在为英特尔的AVX指令使用C内部函数编写代码。如果我有一个压缩双向量(a\uuuu m256d),将它们存储到内存中不同位置(即,我需要将它们扇出到不同的位置,以便它们不再压缩)的最有效方法是什么(即操作数最少)?伪代码: __m256d *src; double *dst; int dst_dist; dst[0] = src[0]; dst[dst_dist] = src[1]; dst[2 * dst_dist] = src[2]; dst[3 * dst_dist] = src[3]

X86 从加载段切换到保护模式

我正在尝试编写简单的引导加载程序 我想以实模式加载boot0,跳转到boot0并从那里加载完整的内核。然后切换到保护模式并执行内核代码 到目前为止,我已经: ;BIOS加载的第一段: 第16位 组织0 jmp 0x07c0:启动 开始: mov-ax,cs mov-ds,ax 斧头 mov al,0x03 莫夫啊,0 int 0x10 斯莫夫,欢迎你 呼叫打印 mov-ax,0x500;将引导0加载到0x500 mov-es,ax;值应为es mov-cl,2;要加载的扇区号 mov al,4;

X86 使用dpkg安装32位库<;1.16

我正在使用Debian 6和DPKG1.15。 在dpkg中,未实施1.15多拱支撑。1.16也没有后端口 我的问题是,我有一个应用程序(Arma II服务器),需要32位版本的libsdtc++6才能启动。但由于dpkg——打印体系结构仅显示“amd64”,而dpkg——add体系结构在Debian 6中不可访问,因此我还没有找到任何添加库的方法 是否有可能为应用程序添加必要的32位库?我现在已经解决了问题。对于其他在Debian 6上有Arma II服务器问题的人:服务器需要一个更新版本的l

X86 nasm中三角恒等式的证明

给出证明三角恒等式的公式: cos(fi+theta) = cos(theta)cos(fi)-sin(theta).sin(fi) 当身份验证为0时,以下用NASM编写的程序应打印1。我总是得到0作为输出。我认为我的逻辑是正确的。内存加载或堆栈溢出时存在一些问题 [bits 32] extern printf extern _exit section .data hello: db "Value = %d ", 10, 0 theta: dd 1.0 fi: dd 2.0 th

X86 为什么我的AVX2水平加法函数不比非SIMD加法快?

我实现了一个内联函数,用于添加向量的所有元素,但它并不比非SIMD加法快 声明: #define N 128 #define M N int __attribute__(( aligned(32)))temp8[8]; __m256i vec; int __attribute__(( aligned(32))) c_result[N][M]; 以下是我在向量中添加所有int值的两种方法: 首先,非SIMD版本是: _mm256_store_si256((__m256i *)&tem

X86 英特尔&x27;的控制指令和移动指令延迟是多少;什么是新的体系结构?

我正在看(第759页)。我正在寻找哈斯韦尔和天湖建筑MOV、PUSH、JMP、CALL指令在该表中故意省略。没有给出延迟信息。为什么呢?不过,第776页给出了Atom处理器的指令延迟 有趣的是,来自英特尔的指令有MOV、PUSH和CALL指令延迟 Agner's为MOV和PUSH提供延迟,但跳过控制指令,如JMP和CALL。知道为什么吗?简单的回答是,对于控制指令和许多类型的独立mov指令,延迟实际上并不是一个有意义的指标 在你提到的评论中: 我参考的是英特尔的控制指令手册。我 控制指令的平均延

X86 英特尔VT-D根表和上下文表关系

我试图了解英特尔VT-D,我读到根表有256个条目,每个根表指向具有256个条目的furhter上下文表,其中每个上下文表包含二级转换。不幸的是,我无法弄清楚根表和上下文表之间的确切关系。我们是否有256*256个上下文表条目?或者每个根表指向相同的上下文表。通过查看下图, 它说每个上下文表都有不同的总线号,但我无法联系到它,如果有人告诉我第二级翻译,那就太好了,我与MMU分页很相似,但VT-D分页确实令人困惑。我已经阅读了VT-D规范,但仍有一些概念不清楚,我在上面描述了这些概念。在PCIe中

X86 哪些指令只能在内核模式下运行?

哪些指令(针对x86芯片)只能在内核模式下运行?我试图理解用户模式和内核模式之间的实际区别。到目前为止,我知道只有在内核模式下才能访问部分地址空间。此内存空间包含驱动程序等,应保护其不受用户程序的影响。内核模式在CPU中是如何实现的?CPU中是否有某个位会变成1或类似的情况 编辑:在 下文提供了答案 我在这里添加了部分答案,这些答案是从答案中提到的链接复制而来的 特权级别指令 指令说明 LGDT将GDT的地址加载到GDTR中 LLDT将LDT的地址加载到LDTR中 LTR将任务寄存器加载到TR中

用于x86的kvm和用于powerpc的kvm之间的差异?

我不熟悉Linux内核的虚拟化组件KVM,想知道PowerPc的KVM实现和x86的KVM实现之间的区别 据我所知,kVM在依赖于体系结构的x86端的实现使用了Intel的 虚拟机扩展,但不确定它在powerpc(e500)端使用什么CPU虚拟化扩展 另外,有没有人能帮助我们了解在kvm_main.c中初始化VCPU的基本思想

X86 在入口点设置断点失败(GDB)

我目前正在练习REW/GDB,在第一条/第二条指令上停止运行/启动时遇到问题。我是GDB/RE的新手,对GDB的一些内部工作原理知之甚少。到目前为止,当我打开程序时,我已经完成了: (gdb) set disassembly-flavor intel (gdb) file /path/to/binary (gdb) info file Symbols from "/path/to/binary".

X86 如果为进程中的条目设置了当前位';s页面表格,这是什么意思?

这是否意味着引用的页面位于进程的逻辑地址空间内?我也在想,引用的页可能是内存驻留的?页表是一种依赖于硬件的数据结构。您需要阅读CPU或MMU(如果它与CPU分开)的文档,了解这些位的含义 在x86上(我猜您的意思是),“present”位意味着页面表项的其余部分包含CPU应该读取的有效数据。如果当前位未设置,CPU将不关心其余位,因此由操作系统赋予它们含义。大多数操作系统在PTE的其余部分不存储任何相关内容,因此在大多数操作系统上,当当前位未设置时,PTE的其余部分只是垃圾。较旧的操作系统存储了

将使用Sparc体系结构的应用程序导出到英特尔x86

我使用的是在Sun Solaris 8中开发的应用程序,它取决于SPARC体系结构(该应用程序使用Solaris 8系统的一些库) 是否可以将该应用程序从SPARC导出到intel x86?我也可以在其他操作系统(如Ubuntu、Windows或其他)中导出吗 我希望这是清楚的,如果你需要更多的信息,我会尽量澄清。 谢谢。我想我们这里讨论的是一个本机应用程序(机器代码二进制) 简短回答:两个问题都是否定的 长答覆: 是否可以将该应用程序从SPARC导出到Intel x86 是的,但这意味着:

X86 为什么NEG指令会干扰进位标志?

在求反(NEG)过程中,除非操作数为零,否则将设置进位标志,在这种情况下,将清除进位标志 但是,这并不能帮助我解释携带旗帜的原因。为什么它会这样做?NEG如何触发一个标志,该标志应该代表执行 如果源操作数为0,则CF标志设置为0;否则设置为1 在我的头脑中,我看到这一点的方式解释了我在做一个逐位求反,然后加上一个。为什么要挂国旗?有没有什么过程可以帮助我在不理解上述规则的情况下解决这个问题 减法运算中的进位标志表示借用。如果你否定x,你(实际上)从0中减去x,这需要借用,除非x是0 因此,除非

X86 什么是mm256 testc pd、mm256 testz pd、mm256 testnzc pd?

我试图理解\u mm256\u testc\u pd,\u mm256\u testz\u pd,以及\u mm256\u testnzc\u pd的本质,我很难理解它们 为了分析\u mm256\u testc\u pd,我确定了以下情况(a是第一个,b第二个\u mm256d参数`): 如果b中的所有压缩双精度都大于0,则ZF=1,CF=1,除了: 如果a和b中的一个双精度包装相互

X86 分页和PIC可执行文件

当使用虚拟内存时,我很难理解PIC可执行文件的需求。从我收集的信息来看,每个程序都在页表中分配了一个条目,因此有一种错觉,即当分页机制处理可能的重定位、页故障等问题时,它拥有整个内存可供使用。因此,如果任何程序都有拥有所有可能内存地址的错觉,为什么要使用PIC呢 两个主要原因: 共享库。不能保证库在特定的地址加载——即使在64位系统上,也无法保证每个库都有一个唯一的加载地址,不会与任何其他库或动态内存分配冲突。因此,共享库中的代码被编译为PIC,这样就可以在需要的任何地址加载 安全。将特定代码存

X86 gdb源代码行/汇编指令不匹配

我正在尝试使用gdb调试我正在编写的x86实模式引导加载程序。引导加载程序代码由多个.asm文件组成,我通过nasm的%include指令将这些文件粘贴在一起。然后,我首先将创建的.asm文件组装成包含调试信息的ELF文件,然后使用objcopy将其转换为原始二进制图像 boot.asm如下所示: bits 16 global _start jmp _start %include "bios_print.asm" %include "a20_enable.a

X86 为了得到实时时钟,你会从DOS挂接什么中断

您将从DOS挂接什么中断来获取实时时钟?阅读可编程中断控制器系列。根据这个,它是中断8(主)和112(从)。这里有一份关于8259A的技术文档:实时时钟不能产生中断。它(可能仍然)与cmos ram耦合,因为它是由电池缓冲的。只能通过端口0x70和0x71访问它 但是,您可以挂接PIT的中断(可编程中断计时器)。这就是中断0x08(例如硬件IRQ0)。据我所知,dos将中断配置为每秒调用27次。您也可以将其编程到其他频率,但这会稍微扰乱dos时钟(端口0x40和0x43)。对此有一些信息。Hoo

X86 从命令行使用devenv.exe并指定平台

我正在尝试从命令行使用devenv.exe编译visual studio解决方案。我可以让它工作,但解决方案中的所有项目都是为任何CPU编译的,我希望它们是为x86编译的。对于所有项目,调试和发布配置都设置为x86 当我在IDE中编译时,它工作得很好。但是当我试图从命令行构建解决方案时,它总是为任何CPU构建所有项目。是否有方法仅在x86中生成devenv.exe 我们使用的是Visual Studio 2012“C:\Program Files(x86)\Microsoft Visual St

X86 汇编级编程中的堆栈指针

我刚刚开始学习汇编级编程。我读到堆栈指针指向堆栈段中的堆栈顶部。 用户是否可以更改存储在堆栈指针8086中的值?是。您可以隐式地更改堆栈指针(sp/esp/rsp分别为16/32/64位),例如push、pop、call或return,或者以与更改任何其他通用寄存器相同的方式显式更改 事实上,如果你反汇编一个程序,你经常会在函数的开头找到类似于sub esp,4(英特尔语法)的东西。它用于在堆栈上为函数中的局部变量保留空间(本例中为4字节)

X86 用于存储重置向量的内存是什么?

来自维基百科:8086处理器的重置向量位于地址FF0H 重置向量存储在哪里 CPU的重置向量地址(本例中为FFFF0h)在硬件设计中是固定的。它是CPU规范的一部分。CPU到达该地址,获取它在那里找到的任何地址,跳转到该地址,然后开始执行。这是一种双间接寻址,具有固定的第一步(CPU转到地址FFFF0h,很可能在某种ROM中),第二步取决于机器。在PC机中,向量将指向BIOS中开始引导过程的早期初始化代码,但更一般地说,它原则上可以是任何可以映射到该地址的硬件内存,但99.9%的时间,它是某种R

X86 异常处理的问题

我一直在关注GDT、IDT和ISR。我编写了异常处理程序,但当我用零除测试它时,它出现了三重错误。我不确定我做错了什么。下面是表h中的描述符: #ifndef VOS_DESCRIPTOR_TABLE_H #define VOS_DESCRIPTOR_TABLE__H #include <stddef.h> #include <stdint.h> #include <string.h> #define SEGMENT_BASE 0 #define SEGM

X86 如何在xmm寄存器中旋转压缩四字?

给定一个包含两个四字(即两个64位整数)的128位xmm寄存器: 如何对单个四字执行旋转?例如: prorqw xmm0, 32 // rotate right packed quadwords ╭──────────────────┬──────────────────╮ xmm0 │ bbaa9988ffeeddcc │ 3322110077665544 │ ╰──────────────────┴──────────────────╯ 我知道SSE2提供: P

X86 今天的BIOS怎么能超过64KB?

首先,BIOS大小限制为段大小(0xFFFF)。但是现在很多BIOS都比64KB大,通常超过10MB。它是如何做到这一点的?现代固件不能在16位实模式下运行;它在引导后很快切换到保护模式或长模式。(它可以包含非代码图像) (这是一个有点手舞足蹈的回答,因为我不知道我头脑中的具体细节。我认为在堆栈溢出之前,有关BIOS映射到哪里和/或启动时CPU跳转到什么CS:IP的相关问题已经出现) 如果您告诉固件加载传统BIOS引导扇区(即以传统模式而不是UEFI引导),则它必须切换回真实模式 在这种情况下,

i386与x86不同?

在下载时,他们提供了两个我不知道有什么区别的下载选项:x86和i386。那么它们之间的区别是什么呢?i386只是x86系列处理器和指令集的第一个型号之一 有关更多信息,您可能需要查看: 引用第二页: 术语x86指的是一个 基于指令集架构[1] 在英特尔8086上。这个术语是派生出来的 从事实上,许多早期的 落后的处理器 与8086兼容,还具有 以“86”结尾的姓名 引用第一条: 英特尔80386,也称为 i386,或者只是386,[1]是32位的 年英特尔推出微处理器 1985[…]作

X86 陷阱和中断有什么区别?

陷阱和中断有什么区别 如果不同系统的术语不同,那么它们在x86上的含义是什么?A是用户进程中的一个例外。它是由零除或无效内存访问引起的。这也是调用内核例程(a)的常用方法,因为这些例程的运行优先级高于用户代码。处理是同步的(因此用户代码被挂起并随后继续)。从某种意义上说,它们是“活动的”——大多数情况下,代码预期陷阱会发生,并依赖于这一事实 是由硬件(如硬盘、图形卡、I/O端口等设备)生成的。这些是异步的(即它们不会发生在用户代码中可预测的地方)或“被动的”,因为中断处理程序必须等待它们最终发生

我可以在我的x64 WIN7上同时安装x86/x64 windbg吗?

我需要分析一些x86转储文件,所以我想在我的计算机上安装x86 windbg 或者我是否可以使用x64 windbg来分析x86转储文件?是的,这样做是个好主意,因为您需要32位版本来调试32位应用程序/转储。所有文件都位于安装目录中,因此您可以同时进行任意数量的安装 另外,请记住,如果使用64位工具创建转储,您将获得64位转储—即使进程是32位的。在这种情况下,您将获得WoW64进程的转储,这使得调试转储有点困难。但是,如果您使用32位工具创建转储文件,您将获得一个常规的32位转储,然后您可以

X86 CPU寄存器内部的端性

我需要帮助理解x86处理器CPU寄存器内部的endianness。我编写了这个小汇编程序: section .data section .bss section .text global _start _start: nop mov eax, 0x78FF5ABC mov ebx,'WXYZ' nop ; GDB breakpoint here. mov eax, 1 mov ebx, 0 int 0x80 我在GDB中运行这

X86 是否可以在VC++;没有SSE4?

我想矢量化一个乘法运算。我尝试使用\u mm\u mul\u epi32,但我的CPU只支持“MMX,SSE(1,2,3,3S),EM64T”指令 有人能告诉我是否可以尝试其他功能吗?这取决于被乘数的范围-如果它们适合16位,那么在SSE4之前有许多16 x 16位多SSE指令可用(例如mm_madd_epi16,mm_mulhi_epi16,mm_mullo_epi16,mm_mulhrs_epi16等) 如果需要32位操作数,但它们是无符号的,则可以使用mm\u mul\u epu32 或者

X86 位集与SSE结合使用的实现和性能

我正在尝试使用SSE(在VisualStudio上)加速我的方法。我是这方面的新手。我在方法中使用的主要数据类型是大小为32的位集,我主要使用的逻辑运算是and运算(很少使用_BitScanForward)。我想知道SSE指令是否可以用来加快我的程序 我现在就是这样做的(我完全完成了,无法直接比较结果): 我使用_mm_set_ps加载操作数(位集)。我在位集上使用to_ulong()将它们转换为无符号长整数: __m128 v1 = _mm_set_ps(b1.to_ulong(),b2.to

IA32机器x86上的对齐

为什么偏移量是0 4 8 16和24?int=4字节,double=8字节。为什么标记上有x?你怎么知道什么时候使用x 其他两个结构和联合偏移是如何工作的?因为数据类型通常与其大小对齐。所以一个四字节的整数通常以四个字节的倍数开始。这并不总是必要的,但通常是一种有效的方法。在某些体系结构中,这是必要的,因为如果您试图访问未对齐的数据,它们实际上会崩溃(引发某种错误) 之所以有x字符,是因为它们是对齐以下数据项所需的填充

x86是什么意思?

我知道x86意味着32位计算机/操作系统,但它本身意味着什么?不是应该是x32吗 另外,i386、i586、i686、i986是什么意思?: x86一词源于这样一个事实,即8086的早期继承者也有以“86”结尾的名字 从技术上讲,x86只是指一系列处理器及其使用的指令集。它实际上没有具体说明数据大小 x86最初是16位处理器(8086和8088处理器)的16位指令集,后来扩展为32位处理器(80386和80486)的32位指令集,现在扩展为64位处理器的64位指令集。它通常被写为80x86,以反

在solaris x86上更新instantClient

我想在Solaris x86服务器上更新instantClient。更新后,我从DBD收到一条错误消息 install_driver(Oracle) failed: Can't load '..../perl/lib/site_perl/5.005/i86pc-solaris/auto/DBD/Oracle/Oracle.so' for module DBD::Oracle: ld.so.1: perl: fatal: libclntsh.so.10.1: open failed: No suc

X86 AVX中的AVX2 VPSHUFB仿真

在AVX中只有128位PSHUFB VPSHUFB xmm1, xmm2, xmm3/m128 对于整个256位AVX寄存器,只有AVX2具有完整的PSHUFB VPSHUFB ymm1, ymm2, ymm3/m256 如何使用AVX内部函数有效地模拟此指令? 同样在这种特殊情况下,源只有8个元素(字节),但这些元素可以在目标的整个32字节内移动。因此,只运行2 xPSHUFB是没有问题的 我在VPSHUFB中发现的一个问题是,它将16(0x10)视为0,只有128及以上的值用零填充!(最

X86 英特尔avx2中是否有与movemask指令相反的指令?

movemask指令获取一个_m256i并返回一个int32,其中每个位(前4位、8位或所有32位,具体取决于输入向量元素类型)都是相应向量元素的最高有效位 我想做相反的事情:取一个32(其中只有4、8或32个最低有效位是有意义的),然后得到一个_m256i,其中每个int8、int32或int64大小的块的最高有效位设置为原始位 基本上,我想从一个压缩的位掩码转换成一个可以被其他AVX2指令(如maskstore、maskload、mask_-gather)用作掩码的掩码 我不能很快找到一个指

X86 使用AVX2有条件地选择一个常量值

我正在寻找一种无分支的方法,根据AVX2值的特定条件选择AVX2常量 我现在所做工作的伪代码: condition = _mm256_cmp_gt(value, limit); result = _mm256_or(_mm256_and(condition, constant_a), _mm256_andnot(condition, constant_b)); 还有比这更有效的方法吗?您可以使用混合指令,例如: 请注意,_epi8内在函数可用于任何元素宽

在实模式下运行时,现代x86处理器上是否提供流水线/OoOE?

在现代x86处理器上运行引导加载程序时,处理器将以实地址模式运行。它的指令流水线功能在实数模式下是否会激活?是的,现代微体系结构中的无序内核无论在何种模式下运行基本相同。最大的区别在于解码器。有关现代CPU如何在内部工作的详细信息,请参阅TagWiki中的链接和其他链接 可能需要额外的硅才能在16位模式下表现出不同的行为,因为它与禁用分页的32位模式非常相似,但具有不同的默认地址大小和操作数大小 我已经读到AMD的CPU是稍慢时,段有一个非零基地。(或者我猜是在16位模式下:当段寄存器本身被设置

x86汇编程序:浮点比较

作为编译器项目的一部分,我必须为x86编写GNU汇编代码来比较浮点值。我已尝试在网上查找有关如何进行此操作的资源,据我所知,其工作原理如下: 假设我要比较的两个值是浮点堆栈上的唯一值,那么fcomi指令将比较这些值并设置CPU标志,以便je,jne,jl。。。可以使用说明 我这么问是因为这只是偶尔奏效。例如: .section .data msg: .ascii "Hallo\n\0" f1: .float 10.0 f2: .float 9.0 .globl ma

X86 一级缓存命中事件的英特尔PMU事件

我试图计算英特尔Haswell处理器上程序在不同缓存级别(L1、L2和L3)上的缓存命中数 我编写了一个程序,通过监视各自的事件来计算二级和三级缓存命中数。为了实现这一点,我查阅了《英特尔x86软件开发手册》,并对二级和三级缓存使用了cache_all_request事件和cache_miss事件。但是,我没有找到一级缓存的事件。 也许我错过了什么 我的问题是: 我应该使用哪个事件编号和UMASK值来统计一级缓存命中事件 澄清* 1) 我想要实现的最终目标是,当程序的所有缓存命中都变成缓存未命中

x86 cpu有什么类型的地址指令?

我学习了一个地址、两个地址和三个地址指令,但现在我想知道,x86使用哪种地址指令?x86是CISC,其中任何指令最多有一个操作数可以是显式内存地址而不是寄存器,使用类似[rdi+rax*4]的寻址模式。(有些指令可以有两个内存操作数,其中一个或两个都是隐式的:) 典型的x86整数指令有两个操作数,都是显式的,就像eax+=edx 还有一些真正的单操作数ALU指令(无隐式其他操作数),如inc/dec、neg、not,它们是隐式1的add/sub、0的sub或-1的XOR(有些具有不同的标志语义)

X86 在保护模式下是否不允许推送imm16?

如果我在nasm中编译以下代码: [bits 16] push word 0x0101 nasm为我提供以下输出: 68 01 01 66 68 01 01 在16位模式下运行时,此指令工作正常 现在,如果我改为: [bits 32] push word 0x0101 nasm为我提供以下输出: 68 01 01 66 68 01 01 这在32位保护模式下不起作用 我知道在保护模式下推送imm8和imm32可以正常工作,我怀疑如果nasm输出的字节与16位情况下的输出字节相同,推送

X86 8086组件的LEA操作

有人能帮我理解以下说明吗- LES SI,DATA1 MOV DI,OFFSET DATA2 MOV BX,[SI] MOV CX,[DI] MOV[SI],CX 对应于以下C代码: // DATA1 and DATA2 are 'far' pointers to word of 16 bits, let's say they are 'short' short bx = *DATA1; *DATA1 = *DATA2; // the old value of *DATA1 is still

x86程序集:在mul(seg故障)后将整数打印到控制台

我正在努力学习x86汇编语言。我正在使用的书是《汇编语言——一步一步,用Linux编程》(我不得不说它相当不错)。到目前为止,我学到了很多东西,但我觉得我也应该挑战自己,在许多方面保持领先,这样我就可以在实践中更快地学习(我可以跟随,自上而下地学习,但我发现它慢得令人厌烦) 因此,我认为尝试将两个寄存器(32位)相乘,然后将数据输出到控制台是一个很酷的想法 问题是,当我执行程序时(我正在使用NASM,就像这本书所做的一样——没有洞察调试器),我收到了一个分段错误。我用这个小锤子在gdb中做了大量

X86 PC上的PlayStation 4软件

PlayStation 4的CPU使用x86指令集。几乎所有现代PC CPU都使用x86指令集。是否可以在PC上运行PS4代码而不进行仿真(因为PS4软件将具有本机PC代码)?据我所知,我们必须先转换PS4可执行文件,使其在Windows、Linux和/或其他操作系统上运行。这可能是个问题吗?虽然完全有可能,但仍有许多障碍需要克服: 获取未加密的游戏文件。这是不可避免的。如果这已经发生在控制台黑客世界中,我不会感到惊讶 确定可执行文件的格式。这是绝对必要的,但在PS3中已经发生了,我相信PS4

MASM x86添加两个整数

我正在编写一个简单的程序,从用户那里获取3个整数,并进行以下计算: 前两个数之和 第二和第三个数字之差 三个数的乘积 商(整数)和第一和第三个数字的余数 应向用户提供显示计算结果的输出。例如,如果用户输入10、9和8,则第一次计算时应显示: 10+9=19 我现在正在做算术题。我能够计算它,但我似乎无意中覆盖了数字_1和数字_2,使之等于相加后的总和,因此我的输出是: 19+19=19 谁能帮我解决我做错了什么?这是我做装配的第一周,所以我很抱歉,如果答案是非常明显的或什么 ; Sum of

可移植可执行文件是否对x86代码段描述符标志进行编码?

根据我对英特尔x86-64手册(特别是第3卷第5.2节)的理解,每个代码段都有与其相关的标志,这些标志控制处理器如何处理数据/代码。特别令人感兴趣的是CS.D、默认操作数/地址大小位和CS.L64位模式位,因为它们会影响指令的解码和执行方式 如果机器类型为i386,Windows是否总是将段描述符设置为CS.D=1,CS.L=0(默认为32位大小),如果机器类型为AMD64,Windows是否总是将段描述符设置为CS.D=0,CS.L=1(64位模式) 如果是后者,是否可以编码CS.D=0,CS

X86 触发处理器SMI的不同方法

我正在编写一些在英特尔平台上以系统管理模式(SMM)运行的固件代码。我想完全了解我的SMI处理程序是如何开始的 我从英特尔手册中读到: 进入SMM的唯一方法是通过SMI引脚发送SMI信号 在处理器上或通过APIC接收的SMI消息 公共汽车 我还了解到,同步SMI可以通过写入I/O端口来触发 我的理解是这样的: SMM只是处理器的一种特殊操作模式。根据我以前的经验,每当我想更改处理器的状态,例如启用分页或进入保护模式时,我通常会修改控制寄存器或模型特定寄存器(MSR)。这些寄存器是处理器的一部分,

其中存储了用于上下文切换的段选择器。(x86)

据我所知,在包括windows和linux在内的现代操作系统上,不使用诸如CS、DS等段寄存器。我的问题是: 如果是这种情况,段选择器存储在哪里 每个线程都有自己的段选择器吗 你读的东西过于简化了 段寄存器必须用于使CPU在受保护/长模式下工作,它们只是不用于任何有趣的事情。(除此之外)。现代操作系统使用平面内存模型,其中所有段的基=0,限制=4GiB(在64位模式下,硬件忽略基和限制,FS/GS除外) CS选择的代码段描述符确定进程在64位内核下是以长模式还是兼容模式运行。(描述符中的L位)。

  1    2   3   4   5   6  ... 下一页 最后一页 共 21 页