未经我的同意,如何防止修改寄存器? (VS2015上的内联x86 MASM)

时间:2015-12-08 02:40:02

标签: c++ visual-studio inline-assembly masm cpu-registers

我试图制作这个简单的程序来模拟学校项目的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寄存器中,将其转换为无限循环。

我想的是,在某些时候,无论是窗口还是其他东西在运行时使用该注册表达的东西,我一直在寻找一个命令或方法来保存除程序以外的任何东西这些寄存器在运行时但我可能会偏向于那个,因为我是汇编编程的初学者,我想到的另一种选择是使用其他寄存器进行计数,但我不知道使用哪个或者如果我使用其他寄存器会发生同样的问题。

0 个答案:

没有答案