NASM invalid effective address: impossible segment base multiplier

Суть программы: читает введённые символы(максимум 3 + \n), анализирует на наличие \n, если нет его, значит число побольше ввели, если есть, то делаю из введеного число и вывожу его ASCII.

section .text
global _start

 _start:

mov edx, mess_l
mov ecx, mess
mov ebx, 1
mov eax, 4
int 0x80

mov edx, 4
mov ecx, value
mov ebx, 0
mov eax, 3
int 0x80

call search_endl

call convert

mov edx, mess2_l
mov ecx, mess2
mov ebx, 1
mov eax, 4
int 0x80

add [res], '0'

mov edx, 1
mov ecx, res
mov ebx, 1
mov eax, 4
int 0x80

mov eax, 1
mov ebx, 0
int 0x80

convert:
cmp [value], 0xa
je _start

mov [deci], 1
mov [res], 0
here:
cmp [num], 0
jl returning

mov al, [value + num] // Ошибка
sub al, '0'
mov bl, [deci]
mul bl
add [res], ax

mov al, [deci]
mov bl, 10
mul bl
mov [deci], ax

inc [num]

jmp here

returning:
ret


search_endl:
mov ecx, 4
loopa:
cmp [value + ecx - 1], 0xa
je done
loop loopa

call clear_stdin
JMP _start
done:
sub ecx, 2
mov [num], ecx
ret

clear_stdin:
mov edx, 1
mov ecx, getchar
mov ebx, STDIN
mov eax, sys_read
int 0x80

cmp byte [getchar], 0xa
jne clear_stdin
ret

section .data
mess db 'Enter code: '
mess_l equ $ - mess

mess2 db 'Symbol: '
mess2_l equ $ - mess2

section .bss
value resb 4
num resb 1
res resb 1
deci resb 1

Ответы (1 шт):

Автор решения: Alex F

Непонятно, что такое value и num. Если это адреса переменных, то mov al, [value + num] неверно. Используйте дополнительный регистр, например:

mov edi, [value]
add edi, [num]
mov al, byte ptr [edi]

Используйте регистр, который у вас свободен, если edi занят.

→ Ссылка