-1

我试着用

mov rdx, 4
push rdx
mov rsi, temp_str
push rsi
mov rdi, temp_str1
push rdi
call memmove

sub rsp, 24
mov [rsp + 16], rdx
mov [rsp + 8], rsi
mov [rsp], rdi
call memmove
add rsp, 24

和其他种类的魔法,但没有任何效果。哪个咒语可以完成这项工作?

(temp_str 和 temp_str1 定义为

temp_str db "abc", 0
temp_str1 db "def", 0

, memmove 来自 msvcrt)

编辑:

sub rsp, 32
mov rcx, temp_str1
mov rdx, temp_str
mov r8, 4
call memmove

也崩溃了。

编辑2:完整代码:

format PE64 console
entry prog

include "win64ax.inc"

section '.idata' import data readable writeable

library kernel32, 'kernel32.dll', msvcrt, 'msvcrt.dll'

import kernel32, ExitProcess,'ExitProcess'
import msvcrt, memmove, 'memmove'

section '.text' code readable executable

prog:

;;mov rdx, 4
;;push rdx
;;mov rsi, temp_str
;;push rsi
;;mov rdi, temp_str1
;;push rdi
;;call memmove


;;sub   rsp, 24
;;mov   [rsp + 16], rdx
;;mov   [rsp + 8], rsi
;;mov   [rsp], rdi
;;call memmove
;;add rsp, 24


;;push rbp
;;mov rbp, rsp
;;push rdx
;;push rsi
;;push rdi
;;call memmove
;;mov rsp, rbp
;;pop rbp


sub rsp, 32
mov rcx, temp_str1
mov rdx, temp_str
mov r8, 3
call memmove         ; crash
add rsp, 32

end_prog:
    invoke ExitProcess, 0

section '.data' data readable writeable
    temp_str db "abc", 0
    temp_str1 db "def", 0
4

2 回答 2

2

无论出于何种原因,我fasm都无法组装它,但等效的 nasm 代码可以正常工作:

extern memmove
extern puts
extern exit

section .text
global WinMain
WinMain:
push rbp
mov rbp, rsp
sub rsp, 32
mov rcx, temp_str1
mov rdx, temp_str
mov r8, 4
call memmove
mov rcx, temp_str1
call puts
mov rsp, rbp
pop rbp
jmp exit

section .data
temp_str db "abc", 0
temp_str1 db "def", 0
于 2019-11-18T14:27:52.553 回答
0

board.flatassembler.net 上的用户革命建议的解决方案:

call memmove

一定是

call [memmove]    
于 2019-11-18T17:17:20.830 回答