LinuxForum.Fans
Тема

NASM ошибка

Автор: nik2281 4 сообщений 1301 просмотров
#348751

Доброго времени суток.

Писал простенькую программку посимвольного чтения с консоли, столкнулся с проблемой:

text

stack2.o: In function `Reading':
stack2.asm:(.text+0x43): relocation truncated to fit: R_386_8 against `.data'

Если правильно посчитал, то ругается на строку mov [ActBufLen], ecx после метки wt: . В Инете искал, решения подходящего не увидел.
Текст программы:

text

global _start
segment .text
_start:
    mov ecx, 0; обнуляем счетчик
    mov ebx, buf -  1; для послед-й записи цифр в массив
Reading:
    add ebx, 0x1;      адрес в массиве buf
    cmp ebx, [BufEnd]; адрес конца массива
    je wt 
    push ecx
    push ebx
    
    mov eax, 3; чтение
    mov ebx, 0
    mov ecx, [CurSymb]
    mov edx, 1
    int 80h
    cmp byte [CurSymb], '0' ; проверка: введена цифра?
jl wt
    cmp byte [CurSymb], '0' + 9
jg wt
    pop ebx
    mov byte [ebx], CurSymb ; кидаем текущий символ в ячейку массива
    pop ecx
    inc ecx;      счетчик
    
    jmp Reading ; переход к след цифре
wt:
    pop ebx
    pop ecx
    mov [ActBufLen], ecx
    cmp byte [ActBufLen], 0 ; были ли введены цифры?
    je pc
    
q: 
    mov eax, 1        ;если не цифра
    int 80h
    
pc:
    jmp q    
    
segment .data
    CurSymb db 0
    ActBufLen dd 0
    buf times 10 db 0
    BufEnd equ buf + 9
#349326

В общем сам разобрался...может кому пригодится, напишу решение. Ошибка была в строке mov byte [ebx], CurSymb . Почему? Не знаю, кто знает, плиз, объясните.
Мой вариант обхода сей ошибки - использование младшей части регистра eax, равной байту:

text

mov al, [CurSymb]
mov byte [ebx], al
#350331
"nik2281" написал:
Почему? Не знаю, кто знает, плиз, объясните.

там две ошибки...
1) синтаксическая: CurSymb здесь — константа, а не адрес в памяти...
2) логическая: x86 не умеет пересылать данные на прямую из памяти в память

"nik2281" написал:
Если правильно посчитал

не правильно, 0x43 — это не строка, а смещение в объектнике... для ассемблера примерно определить можно, например, дизасемблировав его objdump'ом

#350604

Благодарю )

логическая: x86 не умеет пересылать данные на прямую из памяти в память

Так вот оно что.

Войдите или зарегистрируйтесь, чтобы ответить.