我试图制作这个简单的程序来模拟学校项目的droptower(是的,游乐园类型),我在VS2015上使用内联MASM32
这是打印"电梯"的功能的C代码。上去:
void deSubida() {
int a = 0;
while (a <= 9) { //outer loop
printf("Subiendo..\n");
Sleep(900);
system("cls");
int x = 9;
while (x >= 0) { //inner loop
if (x == a) //if both the upper
printf("[x]\n"); //and lower counts match
else printf("[]\n"); //then print the elevator ([x])
x--; //else print empty box ([ ])
}
a++;
}
这是&#34;翻译&#34;我试图将这个功能变成asm:
int deSubidaASM() {
char piso[4] = "[x]";
char pisoVacio[4] = "[ ]";
char texto[] = "%s\n";
_asm {
mov ebx, 0
mov ecx, 9
_while1:
cmp ebx, 9
jg _fin
_while2 :
cmp ecx, 0
jle _resetearWhile2
cmp ebx, ecx
je _printPiso
jne _printVacio
_printPiso :
lea eax, piso //get the pointer for "[x]"
push eax //pushes it into the stack
lea eax, texto
push eax
call DWORD ptr printf //call the printf function
pop edx //clean the stack
pop edx
dec ecx
jmp _while2
_printVacio :
lea eax, pisoVacio
push eax
lea eax, texto
push eax
call DWORD ptr printf
pop edx
pop edx
dec ecx
jmp _while2
_resetearWhile2:
mov ecx, 9
inc ebx
jmp _while1
_fin :
}
}
嵌套循环正常工作,问题是在&#34;调用DWORD ptr printf&#34;在ECX寄存器中,ECX寄存器最终填充了随机的十六进制数或一些存储器地址,当然这使得内部循环后面的序列在9或8处停止,因为内部循环计数的数字存储在ECX寄存器中,将其转换为无限循环。
我想的是,在某些时候,无论是窗口还是其他东西在运行时使用该注册表达的东西,我一直在寻找一个命令或方法来保存除程序以外的任何东西这些寄存器在运行时但我可能会偏向于那个,因为我是汇编编程的初学者,我想到的另一种选择是使用其他寄存器进行计数,但我不知道使用哪个或者如果我使用其他寄存器会发生同样的问题。