[asm] [fasm] [win32]Odczytywanie łańcucha znaków litera po literze

0

Mam zmienną (my_buffer), pod którą wczytuję string z okienka edit instrukcją

my_buffer rb 76h   ; tutaj jest deklaracja zmiennej


invoke GetDlgItemText,[hwnddlg],ID_001, my_buffer, 255

Więc my_buffer zawiera ciąg znaków np. ABCDEFGH, jak pobierać z tego ciągu kolejno poszczególne znaki i porównywać je z innym stringiem?

1
global _main
extern _printf

section .data

fmt: db "%i", 0
fmt2: db "%s", 0
str1: db "hello world", 0
found: db "found char", 0

section .text
_main:

mov al, [str1+0]


cmp al, 'e'
je founds


push dword eax
push fmt
call _printf
add esp, 8

ret

founds:

push found
push fmt2
call _printf
add esp, 8

ret

nasm -fwin32 mul.asm -o mul.obj && gcc mul.obj && a.exe

Nie wiem, czy to jest do końca poprawne, ale mniej więcej tak trzeba napisać.

mov al, [str1+0], pod indeksami masz litery. mov al, [str1+1] => 'e'. Dlaczego +1, a nie np. +2, +4, +8, itd? A no dlatego, że bierzemy jeden bajt, czyli przesuwamy wskaźnik o jeden bajt w jakąś stronę i wtedy dostajemy bajt, który jest jakoś zakodowany, dla 'a' będzie to 97, czyli ‭"01100001" bitowo.‬

Jeśli nie możesz skorzystać z rejestru 8. bitowego, to możesz wyzerować 3 górne bajty, a 4. (czwarty) zostawić.





global _main
extern _printf

section .data

fmt: db "%i", 0
fmt2: db "%s", 0
str1: db "hello world", 0
found: db "found char", 0

section .text
_main:

xor esi, esi

mov edi, [str1+1]
and edi, 0x000000FF


cmp edi, 'e'
je founds


push dword edi
push fmt
call _printf
add esp, 8

ret

founds:

push found
push fmt2
call _printf
add esp, 8

ret

Jak widać instrukcja and wyzerowała 3 bajty. 0x00, to jeden bajt. Bajt zerowy, to 0x00 w hex, a 0b00000000 bin. Najczęściej tak jest zakodowany koniec stringa, więc jeśli chcesz sprawdzić koniec stringa, to musisz porównać coś właśnie z bajtym zerowym.

0

Zważywszy na narzut Windows (wywoływanie API co mili-micro-sek) pisanie w assemblerze C-podobnym nie ma sensu. Ale to pewnie zadanie szkolne?
Bo jak własna ambicja, to lepiej się zająć czym innym

0

Najprościej rzec ujmując w dl mamy znak ze stringu

mov dl, BYTE[my_buffer+(0,1, 2 , lub 3...kolejne znaki)]
0
AnyKtokolwiek napisał(a):

Zważywszy na narzut Windows (wywoływanie API co mili-micro-sek) pisanie w assemblerze C-podobnym nie ma sensu. Ale to pewnie zadanie szkolne?
Bo jak własna ambicja, to lepiej się zająć czym innym

Nie, to nie zadanie szkolne. Bawię się w crackme

1 użytkowników online, w tym zalogowanych: 0, gości: 1