Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 带有两个32位寄存器的x86 imul操作码_Assembly_X86 - Fatal编程技术网

Assembly 带有两个32位寄存器的x86 imul操作码

Assembly 带有两个32位寄存器的x86 imul操作码,assembly,x86,Assembly,X86,我对32位x86操作码的一种语义感到困惑。以下是一个例子: mov eax, 0x0fffffff mov ebx, 0x0fffffff imul eax, ebx <---- eax?? mov-eax,0x0fffffff mov ebx,0x0fffffff imul eax,ebx标记wiki包含一个资源列表,您可以使用该列表查找有关各种说明的信息。例如,在上搜索IMUL将导致您找到 所以这取决于汇编程序将如何编译它,如果使用两个操作数变量,则结果将被截断

我对32位x86操作码的一种语义感到困惑。以下是一个例子:

mov  eax, 0x0fffffff
mov  ebx, 0x0fffffff
imul eax, ebx          <---- eax??
mov-eax,0x0fffffff
mov ebx,0x0fffffff
imul eax,ebx标记wiki包含一个资源列表,您可以使用该列表查找有关各种说明的信息。例如,在上搜索IMUL将导致您找到

所以这取决于汇编程序将如何编译它,如果使用两个操作数变量,则结果将被截断,如果使用单个操作数(
IMUL ebx
),则结果将在
edx:eax

关于标志:当然可能是调试,但是如果我正确地读取了两个操作数版本,当结果被截断时,它将设置CF/OF,所以在您的情况下CF=1,OF=0?(无符号trunc,有符号非溢出)


3小时后。。。 我突然想到,我实际上应该再次搜索一些不错的linux调试器,比如DOS时代Borland的“TD”,因为它可能很方便

当然,gdb总是存在,但我不能喜欢它(特别是因为它通常与AT&t语法有关,我个人不喜欢)

所以我尝试了“ddd”(数据显示调试器),直接在Ubuntu存储库中使用,但它看起来有点旧(是的,MOTIF,如果你知道我的意思,如果你从未听过MOTIF,那么你还不够大)。而且它是基于gdb的。。。这里可能值得一提的是,对于那些想走GNU之路的人来说,但我搜索得更远

最后我下载并编译了。经过几次尝试,我让它在我的旧ubuntu上编译,运行它。。而且。。。就这样。只需点击几下首选项,“TD”的感觉就在这里

所以,我尝试了您的指令(必须首先从NASM示例编译一些helloworld.asm,以运行一些测试linux二进制文件,然后您可以直接覆盖调试器中针对这些简短问题的指令)

在IMUL eax、ebx之后,CPU状态的变化如下:

eax = 0xe0000001
CF = 1, OF = 1, SF = 1, ZF = 0, PF = 0, AF = 0, ...
eax = 0xe0000001
edx = 0x00ffffff
CF = 1, OF = 1, SF = 1, ZF = 0, PF = 0, AF = 0, ...
IMUL ebx
之后,CPU状态的变化如下:

eax = 0xe0000001
CF = 1, OF = 1, SF = 1, ZF = 0, PF = 0, AF = 0, ...
eax = 0xe0000001
edx = 0x00ffffff
CF = 1, OF = 1, SF = 1, ZF = 0, PF = 0, AF = 0, ...
(因此,在本例中,标志是相同的)



我强烈建议你也找一些好的调试器,不要再问这样的问题了。如果运行一个调试器不符合我自己的兴趣,我就不必回答了。

你考虑过阅读手册吗?imul的多操作数形式不会将高半音存储在任何地方,这就是为什么不需要无符号的
mul r32,r/m32
版本,不完全重复:注意仅从调试器了解标志如何工作。许多指令会留下一些“未定义”的标志。在任何特定的CPU上,通常都会有一个定义良好的行为模式,因此您需要阅读手册,以确保您看到的内容与手册描述的内容一致。(否则,您可能会编写无法移植到其他现有x86 CPU的代码,因为这取决于实现定义的行为)。但在这种情况下,我阅读手册时说,如果乘法的上半部分为非零,则设置CF和OF,不管您是否使用了将上半部分存储在任何位置的表单。re:调试器:我想我试过一次
edb
,但让它使用符号表信息确实很麻烦。因此,当asm调试已编译的C程序时,或者甚至调试链接到使用
gcc-g
构建的C程序中的asm函数时,都不是很方便。我错过什么了吗?我通常在Konsole中使用gdb,带有
layout reg
和/或
display/x$xmm0.v16_int8
或其他功能。这不是很好,但大部分都很好。是的,显然手册是关键,这就是为什么我把它放在答案的第一位。我只是想知道IMUL是否会根据结果符号拆分CF/OF,因为人性化的-4*5不会溢出。。。我完全忽略了示例中值的大小。现在我尝试了-4*5,CF=OF=0.)在
~/.gdbinit
:)中放置
设置反汇编风格英特尔
/
布局注册表