Witam , jak usunąć w asemblerze białe znaki z takiego łańcucha znakowego
ciag db "D dFF 2 H",36
Witam , jak usunąć w asemblerze białe znaki z takiego łańcucha znakowego
ciag db "D dFF 2 H",36
Nie bardzo rozumiem pytanie. W takim sam sposób jak w dowolnym innym języku. Najprościej będzie pewnie iterować po ciągu i jeśli trafimy na spacje to przesuwamy resztę ciągu o jeden znak do przodu.
Ja bym to zrobił tak (NASM 32 bit):
global _main
extern _printf ; Printf do prostego wypisania zawartosci :)
section .data
tab dd "hello world, czesc swiecie!", 0
fmt db "%c", 0
section .text
; Wypisanie zawartości tablicy.
; To samo co do{ wypisz(tab[i]); i++; }while(tab[i]!='\0');
wypisz:
push dword[tab+edi]
push fmt
call _printf
add esp, 8
inc edi
cmp dword[tab+edi], 0
jne wypisz
ret
_main:
mov edi, 0
; Pętla główna iterująca każdy element tablicy
; Jeżeli tab[i] == ' ' to skocz do etykiety usuń.
glowna:
mov cl, byte[tab+edi]
cmp cl, ' '
je usun
dalej:
inc edi
cmp dword[tab+edi], 0
jne glowna
mov edi, 0
call wypisz
; Koniec programu
koniec:
xor eax, eax
ret
; Przesuwanie znaku i+1 na pozycję i.
; To samo co while(tab[i+1] != '\0'){ tab[i] = tab[i+1]; i++; }
; Jeżeli tab[i+1] == '\0' to zakończ stringa i resetuj wartości rejestru licznika
usun:
cmp byte[tab+edi+1], 0
je resetuj
; Jeżeli tab[i+1] != '\0' to zamień wg wzoru tab[i] = tab[i+1]
mov cl, byte[tab+edi+1]
mov byte[tab+edi], cl
inc edi
jmp usun
resetuj:
mov byte[tab+edi], 0
mov edi, 0
jmp dalej
Działa bardzo ładnie, sprawdziłem.