Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Не работает прогамма на nasm

360
19 февраля 2007 года
P*t*
474 / / 15.02.2007
Я написал на насме программу helloWorld и попробовал запустить под линуксом.
Вот код:
section .data
msg: db "Hello, World!"
msgLen: equ $-msg

section .text
global _start
mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, msgLen
int 0x80

mov eax, 1
mov ebx, 0
int 0x80

Откомпилировалась она нормально, а вот при запуске выдаёт такое сообщение:
bash: ./helloWorld: cannot execute binary file :confused:
Что это может значить?
1.9K
19 февраля 2007 года
disasm
232 / / 06.02.2006
Во-первых хорошо бы узнать комманду компиляции
Во-вторых если уж
global _start
то надо и метку _start обьявлять...
360
19 февраля 2007 года
P*t*
474 / / 15.02.2007
Объявление метки _start я добавил. Ничего не изменилось.
А компилировал так:
nasm -o helloWorld -l helloWorld.lst helloWorld.asm
chmod u+x helloWorld
391
19 февраля 2007 года
Archie
562 / / 03.02.2005
По-умолчанию nasm компилирует в формат двоичного файла (который система загразить и выполнить не может просто так). Для того, чтобы получить на выходе нужный формат, используй ключ -f (справка по всем форматам: nasm -hf)
P.S. Скорее всего тебе нужен aout
360
20 февраля 2007 года
P*t*
474 / / 15.02.2007
Теперь всё работает:)
nasm -f elf -l helloWorld.lst helloWorld.asm
ld -o helloWorld helloWorld.o
360
21 февраля 2007 года
P*t*
474 / / 15.02.2007
Вот есть ещё такая проблема:

section .data
s: db 'X'
section .code
global _start
_start:

mov AH,0ah
mov CX,1h
mov AL,
int 10h

m: jmp m

Я записал эту програму в boot-сектор на дискете и запустил.
Теоретически она должна выводить на экран символ "Х", но почему-то этого не делает. Вот если заменить mov AL, на mov AL,'X' , то всё работает, а так нет.:confused:

Из за чего такое может происходить?
1.8K
21 февраля 2007 года
k3Eahn
365 / / 19.12.2005
А что у тебя в ds? Ты ж его не настроил.
360
21 февраля 2007 года
P*t*
474 / / 15.02.2007
Цитата: k3Eahn
А что у тебя в ds? Ты ж его не настроил.



А что туда надо записать?

1.8K
21 февраля 2007 года
k3Eahn
365 / / 19.12.2005
Например вот это:
 
Код:
push cs
pop ds
360
21 февраля 2007 года
P*t*
474 / / 15.02.2007
А почему регистры сегментов нельзя задавать обычным способом?
(например mov ds,cs)
1.8K
21 февраля 2007 года
k3Eahn
365 / / 19.12.2005
Хз. Мануал только говорит, что:
Цитата:

If the destination operand is a segment register (DS, ES, FS, GS, or SS), the source operand must
be a valid segment selector.


P.S.: Тот пример, что я привёл не совсем корректен. Поскольку там нужно настраивать ещё и ss.
Поэтому лучше сделать так:

 
Код:
mov ax, cs
mov ds, ax
360
21 февраля 2007 года
P*t*
474 / / 15.02.2007
Но этот символ(s) относится к секции данных, почему тогда к нему можно обращаться через сегмент кода?
1.8K
21 февраля 2007 года
k3Eahn
365 / / 19.12.2005
По умолчанию проц работает с памятью с использованием ds регистра (т.е. в том случае когда в инструкции явно не указан сегмент). Это как раз твой случай. А у тебя в ds какой-нибудь хлам. Ибо ты его не настроил должным образом.
Т.е. при выполнении инструкции
 
Код:
mov al,
проц, по простому говоря и не вдаваясь в подробности, берёт ds, сдвигает его значение на 4 бита влево и прибавляет смещение s. И выполняет чтение по полученному адресу. А теперь угадай, куда указывает этот адрес?

P.S.: код работает?
360
21 февраля 2007 года
P*t*
474 / / 15.02.2007
Работать то работает, но вместо 'X' выводит знак меньше-равно...

Цитата: k3Eahn
берёт ds, сдвигает его значение на 4 бита влево и прибавляет смещение s.



Почему именно на 4?

1.8K
21 февраля 2007 года
k3Eahn
365 / / 19.12.2005
Цитата: P*t*
Работать то работает, но вместо 'X' выводит знак меньше-равно...


"<=" - это ж два символа.

Цитата: P*t*

Почему именно на 4?


Ну у тебя и вопросы... Наверно потому что 16 + 4 = 20. А 20 - столько до поры до времени линий было у шины адреса (если мне не изменяет память) + твой код выполняется в реальном режиме (поэтому он должен соответствовать "реалиям" этого режима). А вообще RTFM (Юрова, Пирогова почитай для начала, загляни в раздел Где скачать?).

360
22 февраля 2007 года
P*t*
474 / / 15.02.2007
Цитата: k3Eahn
"<=" - это ж два символа.



Символ меньше, а под ним какая-то чёрточка.

1.9K
22 февраля 2007 года
disasm
232 / / 06.02.2006
Потому что еще надо
ORG 0x7c00
ставить перед всем этим кодом, т.к. по умолчанию 0x0, и сегмент равен 0x0, т.е. фактически идет обращение к памяти по адресу 0x0, к тому же лучше данные размещать после кода, особенно когда идет речь о бутсекторе, да еще и к тому же метка _start должна быть самой первой.
360
22 февраля 2007 года
P*t*
474 / / 15.02.2007
А ORG устанавливает сегмент кода?
252
23 февраля 2007 года
koderAlex
1.4K / / 07.09.2005
нет . он указывает компилятору откуда осчитывать смещения .
360
23 февраля 2007 года
P*t*
474 / / 15.02.2007
Цитата: koderAlex
нет . он указывает компилятору откуда осчитывать смещения .



То есть в каждой метке будет записно её смещение + 7c00h ?
А можно вместо этого записать в CS и DS значение 7c0h ?

252
24 февраля 2007 года
koderAlex
1.4K / / 07.09.2005
значение в сегментном регистре используются процессором , а ORG 0x7c00 компилятором - это разные вещи ) . лучше купи книжку (или скачай) - справочник по командам х86 процессоров
посмотри команды call и jmp (jxx) .
349
24 февраля 2007 года
Phantom-84
656 / / 27.10.2005
А вы не планируете открывать дистанционные курсы обучения программированию на ассемблере? Я бы подписался :)
252
25 февраля 2007 года
koderAlex
1.4K / / 07.09.2005
не . не планирую . :)
давно пора в гостевую или в студенты темку отправить .
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог