push cs
pop ds
Не работает прогамма на nasm
Вот код:
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:
Что это может значить?
Во-вторых если уж
global _start
то надо и метку _start обьявлять...
А компилировал так:
nasm -o helloWorld -l helloWorld.lst helloWorld.asm
chmod u+x helloWorld
P.S. Скорее всего тебе нужен aout
nasm -f elf -l helloWorld.lst helloWorld.asm
ld -o helloWorld helloWorld.o
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,
Из за чего такое может происходить?
А что у тебя в ds? Ты ж его не настроил.
Цитата: k3Eahn
А что у тебя в ds? Ты ж его не настроил.
А что туда надо записать?
Код:
(например mov ds,cs)
Цитата:
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
mov ds, ax
Но этот символ(s) относится к секции данных, почему тогда к нему можно обращаться через сегмент кода?
Т.е. при выполнении инструкции
Код:
mov al,
P.S.: код работает?
Цитата: k3Eahn
берёт ds, сдвигает его значение на 4 бита влево и прибавляет смещение s.
Почему именно на 4?
Цитата: P*t*
Работать то работает, но вместо 'X' выводит знак меньше-равно...
"<=" - это ж два символа.
Цитата: P*t*
Почему именно на 4?
Ну у тебя и вопросы... Наверно потому что 16 + 4 = 20. А 20 - столько до поры до времени линий было у шины адреса (если мне не изменяет память) + твой код выполняется в реальном режиме (поэтому он должен соответствовать "реалиям" этого режима). А вообще RTFM (Юрова, Пирогова почитай для начала, загляни в раздел Где скачать?).
Цитата: k3Eahn
"<=" - это ж два символа.
Символ меньше, а под ним какая-то чёрточка.
ORG 0x7c00
ставить перед всем этим кодом, т.к. по умолчанию 0x0, и сегмент равен 0x0, т.е. фактически идет обращение к памяти по адресу 0x0, к тому же лучше данные размещать после кода, особенно когда идет речь о бутсекторе, да еще и к тому же метка _start должна быть самой первой.
А ORG устанавливает сегмент кода?
нет . он указывает компилятору откуда осчитывать смещения .
Цитата: koderAlex
нет . он указывает компилятору откуда осчитывать смещения .
То есть в каждой метке будет записно её смещение + 7c00h ?
А можно вместо этого записать в CS и DS значение 7c0h ?
посмотри команды call и jmp (jxx) .
А вы не планируете открывать дистанционные курсы обучения программированию на ассемблере? Я бы подписался :)
давно пора в гостевую или в студенты темку отправить .