之前我曾使用内联汇编程序,但我收到的错误是我以前见过的,似乎无法找到互联网。我最接近的是this或this,但都没有帮助。将EAX寄存器的内容移动到变量dx时出错。在我看来它应该只是下面的,实际上反汇编产生的代码与我写的相同,但我得到两个错误:
int main(int argc, char * argv[]){
auto x1 = 10, x2 = 2, dx = 0;
__asm{
MOV EAX, DWORD PTR [x1]
SUB EAX, DWORD PTR [x2]
MOV DWORD PTR [dx], EAX
;error C2403: 'dx': register must be base/index in 'first operand'
;error C2415: improper operand type
;Disassembly generated the following
mov eax,dword ptr[x1]
sub eax,dword ptr[x2]
mov dword ptr[dx],eax
}
}
我认为我不需要使用不同的寄存器,我认为MOV可以将寄存器的内容移动到这样的变量中。奇怪的是,以下行完全相同但使用y1,y2和dy,并且不会产生错误。我尝试使用[dx]来获得相同的结果,到现在我只能想到像MMX指令这样的东西,这似乎是不必要的。感谢您的帮助!
旁注:在用x86(或任何)汇编语言编写时,是否优先选择全大写和小写?
[编辑]现在我很好奇,如果我使用它混淆了编译器,如何使用dword ptr [dx]生成汇编代码?
答案 0 :(得分:4)
DX本身就是一个16位x86通用寄存器,汇编器会因你的语法而感到困惑(因此'寄存器必须是第一个操作数中的base / index' - 例如,{{1} }} 意思?)。为变量选择其他名称。