Sergomen
@Sergomen
Просто делай добро и оно вернётся

Как обрезать строку в fasm?

Мне нужно перевести последние 10 символов x db "1101111110110011100011011101010" в десятичное число и поместить в y dd 0. Я смог реализовать некоторые процедуры для вывода и конвертации с помощью уроков с ютуба но, когда уже пришлось самому разбираться, мозги совсем варить перестали.

А именно на моменте с процедурой cut- никак не могу понять как занести в ecx (или в buffer(пока-что не понимаю что делаю или надо сделать)) последние 10 символов.

Как это сделать?

Прога крашится с ошибкой Segmentation Fault, а в дебагере видно что в ecx помещается не то что я думал или не так как я думал.

format ELF

public _start

.data:
	x db "1101111110110011100011011101010" 
	y dd 0 
	char rb 1
	buffer.size equ 20
	buffer rb buffer.size
	
_start:
	mov eax, x
	mov ecx, buffer
	call len_str
	sub eax, 10
	mov ebx, x
	xchg eax, ebx ; eax, ebx = ebx, eax
	; eax - "110..."; ebx len-10; ecx buf
	call cut
	call endl
	call exit

cut:;(eax str, ebx pos, ecx buf)
    .for:
        cmp [edx+ebx], byte 0
        	je .close
        mov ecx, [eax+ebx]
        inc ebx
     	jmp .for
       
    .close:
        mov eax, ecx
        ret ; eax str[:pos]


len_str:;(eax str)
    push ebx
    xor ebx, ebx
    
    .for:
        cmp [eax+ebx], byte 0
        	je .close
        inc ebx
        jmp .for
        
    .close:
        mov eax, ebx
        pop ebx
        ret ; eax len

str_to_num:;(eax str)
	push ebx
	push ecx
	push edx
	xor ebx, ebx
	xor ecx, ecx
	
	.for:
		cmp [eax+ebx], byte 0
			je .next_step
		mov cl, [eax+ebx] ; cl - ecx
		sub cl, '0'
		push ecx
		inc ebx
		jmp .for
		
	.next_step:
		mov ecx, 1
		xor eax, eax
		
	.to_num:
		cmp ebx, 0
		je .close
		pop edx 
		imul edx, ecx
		imul ecx, 10
		add eax, edx 
		dec ebx
		jmp .to_num
		
	.close:
		pop edx
		pop ecx
		pop ebx		
		ret ; eax num

print_num:;(eax num)
	push eax
	push ebx
	push ecx
	push edx
	
	xor ecx, ecx
	.for:
		mov ebx, 10
		xor edx, edx
		div ebx
		add edx, '0'
		push edx
		inc ecx
		cmp eax, 0
			je .print
		jmp .for
	.print:
		cmp ecx, 0
			je .close
		pop eax
		call print_char
		dec ecx
		jmp .print
	.close:
		pop edx
		pop ecx
		pop ebx
		pop eax		
		ret

print_char:;(eax char)
	push eax
	push ebx
	push ecx
	push edx
	
	mov [char], al
	mov eax, 4
	mov ebx, 1
	mov ecx, char
	mov edx, 1
	int 0x80

	pop edx
	pop ecx
	pop ebx
	pop eax
	ret

endl:
	push eax
	mov eax, 0xA
	call print_char
	pop eax
	ret


exit:
	mov eax, 1 ; выход 
	mov ebx, 0; возврат 0
	int 0x80


язык: fasm
ос: Linux(Manjaro)
код 32-битный
  • Вопрос задан
  • 103 просмотра
Пригласить эксперта
Ответы на вопрос 1
@VitalyChaikin
Во-первых: sub eax, 10 // а надо sub eax, 11 // т.к. строка начинается с x[0] и заканчивается на x[eax-1]
Во-вторых: ну и чего ты растерялся на процедуре cut ?
// mov ecx, [eax+ebx] // мы вообще то байты считываем из x
mov ecl, byte ptr [eax+ebx]
; далее нам надо этот байт переводить в десятичное число (умножать на разряд (10 в степени) и прибавлять к итоговому результату
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы