Сообщений: 357
Тем: 58
Зарегистрирован: Jan 2016
Репутация:
116
Akumu Написал:Использовать функцию strcpy, вместо копирования первых 8 байт регистром rax.
https://github.com/Emeraude/MinilibC-asm...master/src к примеру
Добавлено через 42 секунды
Только буффер сразу сделайте достаточно большим
что не пойму как заюзать..:redlol:
Лучше взять и изобрести завтрашний день, чем переживать о том, что вчерашний был так себе.
Сообщений: 269
Тем: 20
Зарегистрирован: Jan 2010
Репутация:
221
Sojang Написал:что не пойму как заюзать..:redlol:
Я на самом деле 64х ассемблером не увлекался никогда... В rsi указатель на исходную строку, в rdi буффер куда будет скопирована строка.
Код: global strcpy
section .text
strcpy:
push rbp
mov rbp, rsp
xor rcx, rcx
loop:
cmp BYTE [rsi + rcx], 0
je end
mov al, [rsi + rcx]
mov [rdi + rcx], al
inc rcx
jmp loop
end:
mov BYTE [rdi + rcx], 0
mov rax, rdi
mov rsp, rbp
pop rbp
ret
Сообщений: 357
Тем: 58
Зарегистрирован: Jan 2016
Репутация:
116
Akumu Написал:Я на самом деле 64х ассемблером не увлекался никогда... В rsi указатель на исходную строку, в rdi буффер куда будет скопирована строка.
Код: global strcpy
section .text
strcpy:
push rbp
mov rbp, rsp
xor rcx, rcx
loop:
cmp BYTE [rsi + rcx], 0
je end
mov al, [rsi + rcx]
mov [rdi + rcx], al
inc rcx
jmp loop
end:
mov BYTE [rdi + rcx], 0
mov rax, rdi
mov rsp, rbp
pop rbp
ret
спасибо, однако что то пошло не так:redlol:
[SRC="asm"]
.const
Init dq 140019EA8h
Printf dq 140009148h
.data
msg db 32
.code
onLog proc
mov rsi, [rcx]
mov rdi, [offset msg]
call strcpy
xor ecx, ecx
call Init
mov rcx, rax
lea rdx, msg
call Printf
ret
onLog endp
; test
strcpy proc
push rbp
mov rbp, rsp
xor rcx, rcx
strcpy endp
loopfunc proc
cmp BYTE ptr [rsi + rcx], 0
je endfunc
mov al, [rsi + rcx]
mov [rdi + rcx], al
inc rcx
jmp loopfunc
loopfunc endp
endfunc proc
mov BYTE ptr [rdi + rcx], 0
mov rax, rdi
mov rsp, rbp
pop rbp
ret
endfunc endp
end
[/SRC]
вот такой код не работает
Лучше взять и изобрести завтрашний день, чем переживать о том, что вчерашний был так себе.
Сообщений: 357
Тем: 58
Зарегистрирован: Jan 2016
Репутация:
116
все еще актуально..
Лучше взять и изобрести завтрашний день, чем переживать о том, что вчерашний был так себе.
Сообщений: 278
Тем: 38
Зарегистрирован: Dec 2013
Репутация:
478
Сообщений: 269
Тем: 20
Зарегистрирован: Jan 2010
Репутация:
221
[SRC="asm"]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'[/SRC]
fasm
Сообщений: 21
Тем: 2
Зарегистрирован: Feb 2014
Репутация:
57
msg db 32 ; это буфер в один байт со значением 0x20
msg db 32 dup(0) ; надо так. это буфер в 32 байта, заполненный нулями
и если правильно понял, то
mov rsi, [rcx] ; это копирует в rsi байты по адресу
mov rsi, rcx ; а надо так, чтобы поместить в rsi сам адрес
Сообщений: 78
Тем: 0
Зарегистрирован: May 2015
Репутация:
577
Ugly Написал:msg db 32 ; это буфер в один байт со значением 0x20
msg db 32 dup(0) ; надо так. это буфер в 32 байта, заполненный нулями
и если правильно понял, то
mov rsi, [rcx] ; это копирует в rsi байты по адресу
mov rsi, rcx ; а надо так, чтобы поместить в rsi сам адрес
Первое копирует qword по адресу rcx в rsi
Второе копирует содержимое регистра rcx в rsi
Сообщений: 357
Тем: 58
Зарегистрирован: Jan 2016
Репутация:
116
Akumu Написал:[SRC="asm"]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'[/SRC]
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)) не совсем правильно..мол есть лучше способы. Можете по этому поводу подсказать?
Лучше взять и изобрести завтрашний день, чем переживать о том, что вчерашний был так себе.
Сообщений: 78
Тем: 0
Зарегистрирован: May 2015
Репутация:
577
Sojang Написал:Спасибо ребят) все работает.
Мне тут кое где сказали что выделять память так(msg db 32 dup(0)) не совсем правильно..мол есть лучше способы. Можете по этому поводу подсказать?
Нормально, можно еще msg rb 32, если речь про фасм
|