Мне нужно перевести последние 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-битный