eflags相关内容
我使用masm615汇编程序和TextPad作为编辑器。我正在写32位汇编语言程序。在程序中,由于mul指令,我试图设置零标志,但它不起作用。 谁能告诉我为什么eax寄存器中的结果是零,而零标志是清零的? include irvine32.inc .data .code main proc xor eax,eax call dumpreg
..
使用以下代码片段在EMU8086上进行测试: MOV CX, 1527H SUB CX, 44H 仿真器显示AF为0 1527 - 44 ======== 14E3 手工做减法时,我们得到7-4=3,这里没有问题。 然后2-4,然后我们不得不向下一小块借钱。因此,根据我的理解,AF应该是1。 推荐答案 AF是根据从第3位到第4位的进位(或借用)设置的。
..
据我所知,在现代无序CPU上,最昂贵的东西之一是状态,因为该状态必须在多个版本中进行跟踪,并在许多指令等方面保持最新。 一些指令集,如x86和ARM,广泛使用标志,这是在成本模型不是今天的时候引入的,标志只需要几个逻辑门。类似于每条算术指令设置标志以检测零、进位和溢出。 更新现代无序实现的成本是否特别高?使得例如ADD指令更新进位标志,并且这必须被跟踪,因为尽管它可能永远不会被使用,但是有
..
我不明白 CMP 之后的 JG/JNLE/JL/JNGE 指令. 例如,如果我有: CMP al,dljg标签1 当 al=101;dl =200. 我们问jg有什么问题?是否在 al>dl 上?还是 al-dl>0? 下一个代码的相同问题: test al,dljg标签1 我不明白我们比较什么,以及我们问“jg"什么. 换句话说,我不明白我们什么时候会跳转到 la
..
我理解进位标志和溢出标志的逻辑.但是,当我读到这个程序(用 MASM 8086 编写)时,我有点困惑. 程序的目的是判断一个二次方程是否有两个不同的解、两个相等的解或根本没有解. .model 小.堆.数据aa dw 2bb dw 4cc dw 2sol_msg db "存在两个实解", CR, NLno_sol_msg db "没有真正的解决方案!", CR, NLsol_coinc d
..
我在清除进位标志时遇到了困难,但我想出了一种使用减法来清除它的方法,但我想知道是否有人可以与我分享如何使用加法设置和清除进位标志的更好方法和减法. .databinNum1 字节 11111111bbinNum2 BYTE 00000001b.代码主程序mov al, binNum1 ;AL = 0FFh添加 al, binNum2 ;AL = 00h CF = 1sub al, binNum2
..
我正在分析一系列 x86 指令,并与以下代码混淆: 135328495: sbb edx, edx135328497:否定edx135328499:测试edx,edx135328503:jz 0x810f31c 我知道sbb等于des = des - (src + CF),换句话说,第一条指令不知何故把-CF 进入edx.然后将否定 -CF转化为CF,并testCF是否等于0?? 但请注
..
假设有一段代码: mov al, 12mov bl, 4子 al, bl 在这种情况下,CF = 0 标志,但在我看来它应该等于 1,因为减法运算是在加法运算上实现的,并且处理器不知道我们给它的输入是什么有符号或无符号数字,它只是完成它的工作. 即上面的代码等价于如下: 在 al 寄存器中输入值 12,即 0000 1100 在bl寄存器中输入数值4,即0000 0100
..
我需要在程序集中设置零标志,但不应更改任何其他标志.所以我想做 pushf,把它弹出到 eax,但我不知道如何给标志 reg 它的新值.我能想到的: pushf流行音乐,或 eax , 000..1..00//将 zf 的位置设置为 1 从这里我不知道该怎么做. 解决方案 不涉及任何其他寄存器的最简单解决方案: pushf或 dword [esp],64 ;bit[6] 有 ZF弹出
..
当相乘的两个数字溢出寄存器时,这两个标志如何用于正确计算答案? 例如如果 al 持有 0xff 并乘以 0x2,导致溢出到 ax,标志如何帮助这个? 解决方案 x86/x64 上的乘法在使用单一操作数形式时永远不会溢出. 这是因为 mul 及其兄弟 imul 产生两倍于其操作数的输出1. 在您的示例中,乘以 al 会在 ax 中产生一个输出,并且不会产生溢出. CF 和 O
..
这是我在英特尔 x86-64 的文档中看到的 neg 和许多其他说明(包括 sub,所以将 neg x 的 FLAGS 理解为 0 - x 取决于这一点. OF、SF、ZF、AF 和 PF 标志根据结果设置. 我假设 sf = dest
..
某些CPU(特别是x86 CPU)在其状态寄存器上具有奇偶校验标志.该标志指示运算结果的位数是奇数还是偶数. 奇偶校验标志在编程上下文中的实际实际用途是什么? 旁注:我假设它打算与奇偶校验位一起使用,以执行基本的错误检查,但是这种任务似乎并不罕见,需要保证整个CPU标志. 解决方案 回到过去,性能一直是人们关注的焦点,这更加有意义.它在通信中用于验证完整性(执行错误检查),并且
..
我正在做CSAPP的数据实验室,即isGreater函数. 这是说明 isGreater - if x > y then return 1, else return 0 Example: isGreater(4,5) = 0, isGreater(5,4) = 1 Legal ops: ! ~ & ^ | + > Max ops: 24 Rating: 3
..
我想编写一个简单的代码(或算法)来设置/清除溢出标志.对于设置OF,我知道我可以使用带符号的值.但是我该如何清除呢? 解决方案 有许多可能的解决方案. 例如, test al, al 将清除OF标志,而不会影响寄存器的内容. 或者,如果您不想影响其他标志,则可以直接修改*FLAGS寄存器.例如,在32位中,看起来像这样: pushfd
..
从我阅读的内容来看,似乎有9个不同的标志.是否可以直接读取/更改它们?我知道我可以例如在执行cmp/jmp指令后是否设置零标志,但是我问是否可以做类似的事情 mov eax, flags 之类的. 另外,为了书写,可以手动设置它们吗? 解决方案 可以根据特定说明直接设置或清除某些标志: CLC , CMC :清除,设置和补充进位标记 CLI 和 CLD 和 对于读
..
我想知道如何设置或清除EFLAG方向会如何改变SCAS和MOV指令递减或递增寄存器.我阅读了一些网页,并做了以下假设,我将在下面列出. 我正在使用MASM 32 SDK(不知道是哪个版本,我是通过Visual MASM的下载和安装向导安装的),使用Visual MASM进行安装,并使用MASM32 Editor进行链接并将其构建为对象和可执行文件.我使用的是Windows 7 Pro 64位
..