如何在屏幕上打印计数器masm32的值

时间:2015-12-23 14:41:00

标签: assembly x86 32-bit masm32

我正在尝试打印一个计数器的值,该计数器在我制作的while循环中递增,这只是我正在为一个项目工作的更大函数的一部分,这里是我如何增加的值计数器变量并试图打印它,因为我调用printf函数的方式我相信我需要将char []变量与我想要打印到堆栈上的东西一起推送,我已经尝试将计数器值直接推送到打印(直接使用“push edx”而不是存储char []变量的地址,然后推送它)它只是吐出随机数,可能是值或内容的内存地址,打印函数调用的设置方式当我在_asm标记之前声明我已经指定了内容的char []变量时(例如“char text [4] =”%s \ n“”),我正常工作时,我真的很感激你帮助,如果需要,我也可以发布整个功能。

        _calcGravedad:
        mov edx, G        // G stored in edx
        inc edx           //increases edx
        mov G, edx        //returns edx to G

    //here I try to convert my int G variable (the counter) into a char[]
    //so i can print it, I'm not sure of this part, it doesnt work
        lea eax, G          //stores memory addres of G into eax
        push eax             //push eax into the stack
        call byte ptr _itoa_s //calls the conversion function from c
        pop edx               //transfers the result to edx
        mov gravedad, edx     //moves the result to a char[] variable

    //here's the print function call
        lea eax, gravedad    //get address of gravedad
        push eax           //push it into the stack
        lea eax, texto     //push the print format "%s\n" onto the stack
        push eax           //    
        call DWORD ptr printf   //calls the print function
        pop edx                  //cleans the stack
        pop edx                  //

1 个答案:

答案 0 :(得分:0)

我不确定为什么你需要G的地址而不是它的值,或者为什么你需要两个库调用。为什么不将您的计数器值直接传递给printf以及%d格式而不是%s格式?

我没有工作masm,但这应该说明(MSVC):

#include <stdio.h>

int main(void)
{
    int G = 42;
    char *fmt = "%d\n";
    __asm {
        mov eax,G       ;counter value
        push eax
        mov eax,fmt     ;format argument
        push eax
        call printf
        pop eax
        pop eax        
    }
    return 0;
}

控制台输出:

42

您可能需要针对格式字符串使用不同的mov指令,例如lea eax,fmtmov eax,offset fmt。另请注意,您不需要像以前那样限定库函数调用。