在X64 MASM中使用printf/scanf

问题描述 投票:0回答:1

这款 MASM X64 出自教科书。我无法在 Visual Studio 中进行编译。我已经使用 Visual Studio 成功地使用 printf/scanf 编写并编译了 MASM X32 程序。我无法判断我是否因 X64 或 MASM 编译错误问题而调用 printf/scanf 错误。它给了我一个未解决的外部符号 printf 和 scanf 错误。任何内部都会有帮助

; Section 11.9 Complete Program


printf    PROTO     
scanf     PROTO  
        .data
msg1fmt   byte "%s",0
msg2fmt   byte 0Ah,"%s",0Ah,0Ah,0
msg3fmt   byte "   %lld", 0Ah,0Ah,0
in1fmt    byte "%lld",0
msg2      byte "Enter an integer: ",0
msg3      byte "Reversed",0
n         sqword 5
arry      sqword 5 dup(?)
        .code
main      proc
        mov rcx,n                     ; initialize rcx to n
        mov rbx,0                     ; initialize rbx to 0
for01:    nop
        push rcx                      ; save rcx
        lea rcx, msg1fmt
        lea rdx, msg2
        sub rsp, 40
        CALL printf
        add rsp, 40
        lea rcx, in1fmt
        lea rdx,arry[rbx]
        sub rsp,40
        call scanf
        add rsp,40
        pop rcx                       ; restore rcx
        add rbx,8                     ; increment rbx by 8
        loop for01
endfor01: nop

        lea rcx, msg2fmt
        lea rdx, msg3
        sub rsp, 40
        CALL printf
        add rsp, 40
        mov rcx,n                     ; initialize rcx to n
        sub rbx,8                     ; subtract 8 from rbx

for02:    nop
        push rcx                      ; save rcx
        lea rcx, msg3fmt
        mov rdx, arry[rbx]
        sub rsp, 40
        CALL printf
        add rsp, 40
        pop rcx                       ; restore rcx
        sub rbx,8                     ; decrement rbx by 8
        loop for02
endfor02: nop

        ret
main      endp
        end
assembly masm
1个回答
0
投票

printf
scanf
是 C 运行时库的一部分
libcmt.lib
和 您需要关键字
extern
将它们声明为外部过程。

反向.asm

option casemap:none

includelib kernel32.lib
includelib user32.lib
includelib libcmt.lib
includelib legacy_stdio_definitions.lib

extern printf:proc
extern scanf:proc


; Section 11.9 Complete Program


        .data
msg1fmt   byte "%s",0
msg2fmt   byte 0Ah,"%s",0Ah,0Ah,0
msg3fmt   byte "   %lld", 0Ah,0Ah,0
in1fmt    byte "%lld",0
msg2      byte "Enter an integer: ",0
msg3      byte "Reversed",0
n         sqword 5
arry      sqword 5 dup(?)
        .code
main      proc
        mov rcx,n                     ; initialize rcx to n
        mov rbx,0                     ; initialize rbx to 0
for01:    nop
        push rcx                      ; save rcx
        lea rcx, msg1fmt
        lea rdx, msg2
        sub rsp, 40
        CALL printf
        add rsp, 40
        lea rcx, in1fmt
        lea rdx,arry[rbx]
        sub rsp,40
        call scanf
        add rsp,40
        pop rcx                       ; restore rcx
        add rbx,8                     ; increment rbx by 8
        loop for01
endfor01: nop

        lea rcx, msg2fmt
        lea rdx, msg3
        sub rsp, 40
        CALL printf
        add rsp, 40
        mov rcx,n                     ; initialize rcx to n
        sub rbx,8                     ; subtract 8 from rbx

for02:    nop
        push rcx                      ; save rcx
        lea rcx, msg3fmt
        mov rdx, arry[rbx]
        sub rsp, 40
        CALL printf
        add rsp, 40
        pop rcx                       ; restore rcx
        sub rbx,8                     ; decrement rbx by 8
        loop for02
endfor02: nop

        ret
main      endp
        end

以上内容是使用以下命令编译和链接的:

@echo on

if not defined DevEnvDir (
  call "C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvars64.bat"
)

ml64.exe /c reverse.asm

link.exe /SUBSYSTEM:console /LARGEADDRESSAWARE:NO reverse.obj 

运行程序输出

© www.soinside.com 2019 - 2024. All rights reserved.