Assembly 如何在程序集中打印到控制台?

Assembly 如何在程序集中打印到控制台?,assembly,printing,console,Assembly,Printing,Console,我想学习汇编语言。为了开始,我会将结果打印到控制台,比如说5+5。我正在Windows 7 64位中使用平面汇编程序 我刚刚开始编写代码,我希望将v1和v2字符串打印到控制台,但我没有成功: v1 db 'Enter value 1: ', 0 val1 db 80 dup(?) v2 db 'Enter value 2: ', 0 val2 db 80 dup(?) 编译完代码后,我尝试使用fasm.exe hello.ASM运行它,但没有显示任何内容。我想我会被要求输入一个值 我做错了什

我想学习汇编语言。为了开始,我会将结果打印到控制台,比如说5+5。我正在Windows 7 64位中使用平面汇编程序

我刚刚开始编写代码,我希望将v1和v2字符串打印到控制台,但我没有成功:

v1 db 'Enter value 1: ', 0
val1 db 80 dup(?)
v2 db 'Enter value 2: ', 0
val2 db 80 dup(?) 
编译完代码后,我尝试使用
fasm.exe hello.ASM
运行它,但没有显示任何内容。我想我会被要求输入一个值


我做错了什么?

您必须编写代码才能将数据打印到控制台--现在,您只是定义了一些数据块

您通常会使用类似于
WriteFile
或(如果您想更喜欢)的
writeconsole输出打印数据。以下是一个示例“Hello World”程序作为起点:

.386
.MODEL flat, stdcall

getstdout = -11

WriteFile PROTO NEAR32 stdcall, \
        handle:dword,           \
        buffer:ptr byte,        \
        bytes:dword,            \
        written: ptr dword,     \
        overlapped: ptr byte

GetStdHandle PROTO NEAR32, device:dword

ExitProcess PROTO NEAR32, exitcode:dword

.stack 8192

.data
message db "Hello World!"
msg_size equ $ - offset message

.data?
written  dd ?

.code
main proc   
    invoke GetStdHandle, getstdout
    invoke WriteFile,                   \
           eax,                         \
           offset message,              \
           msg_size,                    \
           offset written,              \
           0
    invoke ExitProcess, 0
main endp
        end main

您必须编写代码才能将数据打印到控制台——现在,您只需要定义一些数据块

您通常会使用类似于
WriteFile
或(如果您想更喜欢)的
writeconsole输出打印数据。以下是一个示例“Hello World”程序作为起点:

.386
.MODEL flat, stdcall

getstdout = -11

WriteFile PROTO NEAR32 stdcall, \
        handle:dword,           \
        buffer:ptr byte,        \
        bytes:dword,            \
        written: ptr dword,     \
        overlapped: ptr byte

GetStdHandle PROTO NEAR32, device:dword

ExitProcess PROTO NEAR32, exitcode:dword

.stack 8192

.data
message db "Hello World!"
msg_size equ $ - offset message

.data?
written  dd ?

.code
main proc   
    invoke GetStdHandle, getstdout
    invoke WriteFile,                   \
           eax,                         \
           offset message,              \
           msg_size,                    \
           offset written,              \
           0
    invoke ExitProcess, 0
main endp
        end main

您正在声明数据,但没有对其执行任何操作。您可以调用Windows函数(例如OutputDebugString)或c-runtime函数(例如printf)来显示某些内容。您正在声明数据,但没有对其执行任何操作。您可以调用Windows函数(例如OutputDebugString)或c运行时函数(例如printf)来显示某些内容。还需要输入例程以及一些十进制/二进制转换。@BrianKnoblauch:是的,但由于这显然是个家庭作业,我不想把所需的一切都交给它……评论并不是针对您的,这是为了OP的利益,所以当它不能解决他的所有问题时,他不会感到失望。:-)谢谢你的回答。首先,这不是家庭作业(作为一种证明,也许你可以看看我之前的问题,看看我对编程语言有着普遍的兴趣,并且问了一些关于不同编程语言、技术等的问题)。我从未接触过assembly,只想了解一些基本知识。所以,要打印到控制台,我必须以某种方式导入具有该功能的库,然后在该库中调用这些方法?是的,基本上就是这样。在DOS等较旧的系统上,只将数据写入屏幕缓冲区是很常见的,但现代系统通常不支持/允许这样做。还需要输入例程以及一些十进制/二进制转换。@BrianKnoblauch:是的,但因为这显然是家庭作业,我不想把所有需要的东西都交给他……评论不是针对你的,它是为了OP的利益,所以当它不能解决他的所有问题时,他不会感到失望。:-)谢谢你的回答。首先,这不是家庭作业(作为一种证明,也许你可以看看我之前的问题,看看我对编程语言有着普遍的兴趣,并且问了一些关于不同编程语言、技术等的问题)。我从未接触过assembly,只想了解一些基本知识。所以,要打印到控制台,我必须以某种方式导入具有该功能的库,然后在该库中调用这些方法?是的,基本上就是这样。在DOS这样的旧系统上,只将数据写入屏幕缓冲区是很常见的,但现代系统通常不支持/允许这样做。