Показать сообщение отдельно
Непрочитано 28.08.2016, 13:42   #19
Аватар для Sojang
Пользователь

Автор темы (Топик Стартер) Re: [Asm] Прочитать параметры

Цитата:
Сообщение от Akumu Посмотреть сообщение
format PE64 console
entry start
 
include 'win64a.inc'
 
section '.text' code readable executable 
 
start: 
	lea rax,[testmsg]
	call onLog
	xor rax,rax 
	call [ExitProcess] 
	int3
 
onLog:
	; fix me
	mov rsi,rax 		; src str
	lea rdi,[msgbuf] 	; dst buff
	mov rdx, 511 		; max chars
	call strncpy		; copt string from [rax] to [msgbuf]
	retn
	int3
 
strncpy:
	push rbp
	mov rbp, rsp
 
	xor rcx, rcx
jloop:
	cmp BYTE [rsi + rcx], 0
	je jend
	cmp rcx, rdx
	je jend
	mov al, [rsi + rcx]
	mov [rdi + rcx], al
	inc rcx
	jmp jloop
 
jend:
	mov BYTE [rdi + rcx], 0
	mov rax, rdi
 
	mov rsp, rbp
	pop rbp
	ret
 
section '.data' data readable writeable
	testmsg db "This is a test message!",0
	msgbuf rb 512
 
section '.idata' import readable writeable
	library kernel32,'KERNEL32.DLL'
	include 'api/kernel32.inc'
Code: ASM
fasm
Цитата:
Сообщение от Ugly Посмотреть сообщение
msg db 32 ; это буфер в один байт со значением 0x20
msg db 32 dup(0) ; надо так. это буфер в 32 байта, заполненный нулями

и если правильно понял, то
mov rsi, [rcx] ; это копирует в rsi байты по адресу
mov rsi, rcx ; а надо так, чтобы поместить в rsi сам адрес
Спасибо ребят) все работает.
Мне тут кое где сказали что выделять память так(msg db 32 dup(0)) не совсем правильно..мол есть лучше способы. Можете по этому поводу подсказать?
__________________
Лучше взять и изобрести завтрашний день, чем переживать о том, что вчерашний был так себе.
Sojang вне форума Ответить с цитированием