这款 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
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
运行程序输出