- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以,我有这样的代码:
XOR DX, DX
MOV BX, 1
MOV AX, BX
MOV CX, 10
.LOOP:
JCXZ .EXIT_LOOP
IMUL AX, 34 ; in here
SUB AX, DX
ADD AX, 2
PUSH AX
INC DX
DEC DX
XCHG BX, DX
MOV BX, [SP]
LOOP .LOOP
.EXIT_LOOP:
我不知道,在 16 位寄存器中
IMUL
指令给我一个错误,如
this在 emu8086 中。
IMUL EAX, 34
这样的 32 位寄存器应该没问题(不在 emu8086 中)。
最佳答案
IMUL
instruction 的直接形式, 操作码 6B
和 69
, 实际上需要三个操作数,它们的大小都相同(这里是 16 位):IMUL r, r/m, imm
.它将第二个操作数乘以第三个操作数并将结果放在第一个操作数中,在溢出时截断。原始 8086 不支持这种形式,但在 80186 中作为扩展添加,大约在 1982 年,并且得到了所有较新的 x86 处理器的支持。
您的 32 位汇编器显然支持 IMUL EAX, 34
作为 IMUL EAX, EAX, 34
的语法糖, EAX 同时用作源操作数和目标操作数。
所以这里有三种可能;我对 emu8086 一无所知,所以不确定哪一个适用。
IMUL AX, AX, 34
.IMUL r/m
,并将常量 34 加载到寄存器中(或将其放入内存中)。请注意 IMUL r/m
正在扩大并将其 32 位结果放入 DX:AX
,所以您在 DX
中的零值如果结果为负数或大于 32767 将被破坏;您需要相应地调整您的代码。x * 34 == (x << 5) + (x << 1)
.或者,当然,您可以找到另一个支持 186 条指令的模拟器。关于assembly - x86-16 imul 指令 "wrong parameters"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64390306/
谢谢帮助,我的问题是关于从下面的代码中收到的 ax 值? mov al,22h mov cl,0fdh imul cl 真机结果:ff9a 我的预期:00:9a(通过二进制相乘) 第一个数字是 22h
我编译了以下程序: #include uint64_t usquare(uint32_t x) { return (uint64_t)x * (uint64_t)x; } 这反汇编为: 0:
我正在使用运行时调试器。 EAX:0000 0023 EDX:5555 5556 imul edx EAX:aaaa aac2 EDX:0000 000b 我完全困惑,无法弄清楚这种乘法是如何工作的。
我目前正在从游戏中反转哈希函数并遇到了这个问题: Game.exe+1F745D - 69 C0 93 01 00 01 - imul eax,eax,Game.exe+C00193 指令本身不是问题
哪个更快 - val = val*10; 或 val = (val<<3) + (val<<2); 与移位指令相比,imul 需要多少个时钟周期? 最佳答案 这是21世纪。现代硬件和编译器知道如何生成
我正在学习 ASM 语言并在 Ubuntu Eclipse C++ 上试用 IMUL 函数,但出于某种原因,我似乎无法从我的代码中获得所需的输出。 Required: Multiply the neg
它比 * 表达式表现更好吗?为什么? This article描述它对像 Emscripten 这样的项目很有用。这是为什么? 谢谢 最佳答案 精简版 Math.imul(a,b) 将 a 和 b 相
我必须用 C 语言编写什么才能让汇编器用一个操作数显示 imul ?例如: imul %ebp 最佳答案 如果您想编写 C 代码,以便编译器使用一个操作数发出 imul,那么唯一的方法是使用加宽有符
我写了一个非常基本的 C 函数,叫做“multby22”,它的作用正如它的名字所暗示的那样:它需要一个 long 并返回那个 long 乘以 22。(我知道这是一个毫无意义的函数,但我把它写到尝试帮助
我发现 mul和 imul可用于将有符号数乘以无符号数。 例如: global _start section .data byteVariable DB -5 section .text _s
所以,我有这样的代码: XOR DX, DX MOV BX, 1 MOV AX, BX MOV CX, 10 .LOOP: JCXZ .EXIT_LOOP
我想知道,主要是出于好奇,对于一个操作使用同一个寄存器是否比使用两个更好。考虑到性能和/或其他问题,什么会更好? mov %rbx, %rcx imul %rcx, %rcx 或者 mov %rbx,
MUL 运算符只有单操作数形式有什么原因吗? IMUL 运算符可以采用三种不同的形式(一个、两个或三个操作数),这样更方便。从技术的角度来看,我看不出 MUL 运算符不能采用二/三操作数形式的任何原因
我在尝试使用 Math.imul() 方法,我发现它在输入很少时速度更快,而在输入很多时速度较慢。这是为什么? (也许它与 Math.imul() 本身无关,但这没关系,我仍然有兴趣了解我得到的结果!
这个问题是关于我们如何将一个整数与一个常数相乘。那么让我们看一个简单的函数: int f(int x) { return 10*x; } 如何才能最好地优化该函数,尤其是在内联到调用方时? 方
在/O2(发行版)模式下查看Visual Studio(2015U2)生成的程序集时,我看到此“手动优化”的C代码片段已转换回乘法: int64_t calc(int64_t a) { retur
我正在阅读说明 imul 0xffffffd4(%ebp, %ebx, 4), %eax 我对它到底在做什么感到困惑。我知道 imul 相乘,但我无法弄清楚语法。 最佳答案 (我知道并且更喜欢 Int
我正在查看为这个简单的 x64 程序生成的程序集 Visual Studio: struct Point { int a, b; Point() { a = 0; b
说我有 EDX = 0xA28 EAX = 0x0A280105 我运行这段 ASM 代码 IMUL EDX 据我所知,如果指定了一个操作数,它只使用 EAX.. 所以在C代码中应该是这样的 EAX
我试图从本质上得到以下结果...... Inputs EAX, EDX IMUL EDX Return EAX:EDX as full 64-bit result 我正在查看 https://gito
我是一名优秀的程序员,十分优秀!