问题标签 [eflags]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 模拟jg指令(datalab的isGreater)
我在做CSAPP的datalab,isGreater函数。
这是描述
x 和 y 都是 int 类型。
所以我考虑模拟jg指令来实现它。这是我的代码
jg指令需要SF == OF和ZF == 0。
但它不能通过特殊情况,即x = 0x7fffffff(INT_MAX), y = 0x80000000(INT_MIN)。
我这样推断:
x + yComplement = 0xffffffff,所以 SF = 1,ZF = 0,由于 xSign != ySign,OF 设置为 0。
那么,我的代码有什么问题,是我的 OF 设置操作错误吗?
assembly - 设置/取消设置 MASM 标志如何工作
设置手段flag value = 1
和未设置手段flag value = 0
现在我了解了在 MASM 中设置和取消设置标志的几种方法,如下所示:
同样适用于Sign flag
:
要设置Carry flag
,我们使用 STC 指令;要清除进位标志,我们使用 CLC:
为了设置Overflow flag
,我们将两个正值相加,产生一个负和。要清除Overflow flag
,我们将操作数与 0 进行或运算:
和flags 操作是自己理解Overflow
和Carry
容易掌握的,但是我发现很难理解设置Zero/Sign
flags 背后的数学原理。任何帮助表示赞赏!
谢谢!
x86 - 如何在用户模式下设置/清除 x86 IA32 Intel CPU 上的 TF 标志
我想知道在 x86 IA32 Intel CPU 的用户模式下设置/清除 EFLAGS.TF 的步骤
在下面尝试清除 TF 标志,但出现错误***** Unhandled interrupt vector *****
assembly - 组装:FE + FB
如果在 8 位寄存器中进行以下算术运算,进位标志 (CF)、溢出标志 (OF)、符号标志 (SF) 和零标志 (ZF) 将被设置为什么?
0xFE + 0xFB
- CF=1,OF=0,SF=1,ZF=0
- CF=1,OF=1,SF=0,ZF=0
- CF=1,OF=0,SF=1,ZF=1
- CF=1,OF=1,SF=1,ZF=0
- 以上都不是。
谢谢
来自 William Stallings 的练习题 - 计算机组织和架构。
assembly - 为什么要避免使用 POPF 来恢复中断标志状态?
我的问题不在于BX被用作返回值而不是将其放置在全局内存位置或堆栈上。我观察到这段代码最近在评论中发布。该代码用于使用 BIOS 的实模式鼠标处理程序。保存/恢复FLAGS寄存器状态的两个小函数如下:
我想了解为什么该restore_if_flag
函数会这样做:
而不是POPF
像这样简单地使用:
为什么要使用STI/CLI显式保存/恢复中断标志,而不是简单地使用POPF恢复以前的 FLAGS 寄存器?
c - Valgrind 是否忽略 RFLAGS 寄存器中的陷阱标志 (TF) 位?
在我的一个项目中,我需要手动编辑 RFLAGS 寄存器以使用 TF 位在每条指令上引发 SIGTRAP。它在直接运行程序时有效,但在 Valgrind 下运行时无效。
这是一个快速程序,说明了我的意思:
这是预期的输出:
这是 Valgrind 的输出:
assembly - 方向 EFLAG 的值如何影响 SCAS 和 MOVS 指令?
我想知道设置或清除方向 EFLAG 如何改变 SCAS 和 MOV 指令如何递减或递增寄存器。我阅读了一些网页并做出了以下假设,我将在下面列出。
我正在使用 MASM 32 SDK - 不知道是什么版本,我通过 Visual MASM 的下载和安装向导安装了 - 使用 Visual MASM 和 MASM32 编辑器将它们链接并构建到对象和可执行文件中。我使用的是 Windows 7 Pro 64 位操作系统。
SCAS
SCAS 指令“将 AL 中的字节或 AX 中的字与 ES 中的 DI 指向的字节或字进行比较”。因此,要使用 SCAS,必须将目标字符串地址移动到 EDI,并且必须将要查找的字符串移动到累加器寄存器(EAX 和变体)。
在使用 32 位系统时,设置方向标志然后使用 SCAS 将停止 SCAS 运行。在 32 位系统上,不可能强制 SCAS“从头到尾扫描字符串”。
任何 REP 指令始终使用 ECX 寄存器作为计数器,并且始终递减 ECX,而不管方向标志的值如何。这意味着使用 REP SCAS 不可能“从头到尾扫描字符串”。
资料来源:
SCAS/SCASB/SCASW,Birla Institute of Technology and Science
扫描字符串,来自 c9xm.me
SCAS/SCASB/SCASW/SCASD — 扫描字符串,来自 felixcloutier.com
MASM:使用“字符串”说明,来自 www.dreamincode.net /论坛
以下是我将在问题中引用的程序的部分代码:
- “搜索”部分下的代码一次搜索字符串 InputEnd 4 个字节,因此一次搜索 4 个字符。该块扫描EAX中的字符,即单词“省略”,总是从edi中的内存地址的值开始,然后根据SCAS的后缀(B,W,D,Q)递增(MASM:使用'String ' 说明,dream-in-code.com)。
MOVS
使用“移动最后一个单词”部分,我可以从字符串 Input 中获取最后一个字节。然后我使用 MOVSW 将字符串 Input 的最后 4 个字节移动到 InputEnd,假设方向标志是明确的。我必须将 Input 定义为一个字节数组
Input db 32 dup(?)
- 才能使块工作。无论我如何定义 InputEnd(无论是“dd ?, 0”还是“db 12 dup(?)”),mov 和 scas 指令的操作(标志设置、寄存器修改等)都不会改变。SCAS 和 MOV 的递增/递减量取决于命令的后缀/最后一个字母,而不是存储在 EDI 和 ESI 中的指针的定义字节或大小。
使MOVS从字符串的开头转移到结尾是不可能的。你必须是字符串的长度;将对应的地址加载到EDI和ESI;将字符串的长度添加到存储在 EDI 和 ESI 的地址中;最后,使用 设置方向标志
std
。这里的一个危险是目标地址低于源或目标字节。使用 MOVS 反转字符串的字母是不可能的,因为 EDI 和 ESI 要么都被 MOVS 递减,要么都被递增。
来源(除了之前在 SCAS 部分中列出的站点):
https://c9x.me/x86/html/file_module_x86_id_203.html
http://faydoc.tripod.com/cpu/movsd.htm
这些假设是否正确?网站 URL 上的 x86 文本是否表明网站信息错误?
assembly - 在 LLVM 中的 FLAGS 中读取并生成额外的返回值
我正在观看 Herb Sutter 在 CppCon 2019 上的演讲,其中一个想法是使用控制标志寄存器位来标记在函数调用期间产生了异常。例如(假设 x86 目标)一个引发错误的函数可以stc
在返回之前发出一条指令,调用者可以在它返回后立即执行条件跳转以检查是否应该处理错误。它很聪明,很高效(比在单独的寄存器中返回条件标志要好得多),而且很简单。
但是,如何在 LLVM 中实现这样的功能呢?我想可以MachineBasicBlock
用来发出标志集指令,但是是否可以保证 LLVM 之后不会插入可能会更改标志值的指令?另外,如何测试标志值并跳转到 LLVM IR 块?
请注意,我的动机纯粹是出于好奇。我实际上并不是在研究编译器——我只是想知道这些东西是如何工作的。
visual-studio - 如何在 Visual Studio 寄存器面板中显示标志?
我注意到 Visual Studio 中其他人的注册面板显示了这些标志。
(来源:https ://youtu.be/LqyVybUodXE?t=163 )
但是,我的寄存器窗格如下所示:
面板中没有标志信息。我检查了设置和选项,找不到任何线索。如何在寄存器面板中显示它们?