如何在屏幕上打印计数器 masm32 的值
How do I print on screen the value of a counter masm32
我正在尝试打印在我创建的 while 循环内递增的计数器的值,这只是我正在为项目开发的更大函数的一部分,下面是我如何增加计数器变量的值并尝试打印它,因为我调用 printf 函数的方式我相信我需要将 char[] 变量与我想要打印的内容一起推送到堆栈上,我尝试推送计数器值直接打印(直接使用 "push edx" 而不是存储 char[] 变量的地址然后推送它)并且它只是吐出随机数可能是值的内存地址或其他东西,打印函数调用的方式当我打印 char[] 变量时设置正常工作,当我在 _asm 标记之前声明它们时我已经为其指定了内容(例如“ char text[4] = “%s\n” ”),非常感谢您的帮助,如果需要,我也可以 post 完成整个功能。
_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 //
我不确定为什么您需要 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,fmt
或 mov eax,offset fmt
。另请注意,您不需要像您那样限定库函数调用。
我正在尝试打印在我创建的 while 循环内递增的计数器的值,这只是我正在为项目开发的更大函数的一部分,下面是我如何增加计数器变量的值并尝试打印它,因为我调用 printf 函数的方式我相信我需要将 char[] 变量与我想要打印的内容一起推送到堆栈上,我尝试推送计数器值直接打印(直接使用 "push edx" 而不是存储 char[] 变量的地址然后推送它)并且它只是吐出随机数可能是值的内存地址或其他东西,打印函数调用的方式当我打印 char[] 变量时设置正常工作,当我在 _asm 标记之前声明它们时我已经为其指定了内容(例如“ char text[4] = “%s\n” ”),非常感谢您的帮助,如果需要,我也可以 post 完成整个功能。
_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 //
我不确定为什么您需要 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,fmt
或 mov eax,offset fmt
。另请注意,您不需要像您那样限定库函数调用。