ttoorrmmoozz
написал 15 февраля 2005 года в 20:32 (1112 просмотра)
Ведет себя
неопределенно; открыл 21 тему в форуме, оставил 25 комментариев на сайте.
На машине стоит асемблер версии CNU assembler 2.14.90 , 2003
Обьясните мне , где я неправ :
пытаюсь откомпилировать такой кусок :
entry start
start:
mov ax,#0xb800
mov es,ax
seg es
mov [0],#0×41
seg es
mov [1],#0×1f
loop1: jmp loop1
Запускаю команду :
as boot.s -o boot.o
Вывод :
boot.s:1: Error:no such instruction : 'entry start'
boot.s:3: Error:expecting operand after ',' ;got nothing
boot.s:4: Error:too many memory references for 'mov'
boot.s:5: Error:no such instruction: ’seg es'
Я так понял , что асемблер каких-то хидеров не видит ?
Последние комментарии
- OlegL, 17 декабря в 15:00 → Перекличка 21
- REDkiy, 8 июня 2023 года в 9:09 → Как «замокать» файл для юниттеста в Python? 2
- fhunter, 29 ноября 2022 года в 2:09 → Проблема с NO_PUBKEY: как получить GPG-ключ и добавить его в базу apt? 6
- Иванн, 9 апреля 2022 года в 8:31 → Ассоциация РАСПО провела первое учредительное собрание 1
- Kiri11.ADV1, 7 марта 2021 года в 12:01 → Логи catalina.out в TomCat 9 в формате JSON 1
ecobeing.ru
Экология и вегетарианство на благо всем живым существам Планеты.
нет, «хидеры» тут вообще ни при чём.
просто-напросто у GNU Asm несколько другой синтаксис (погляди, что оно тебе при gcc -S test.c сделает в test.s)
так что — тебе надо поставить NASM или утилиту intel2gas.
_start:
movl $SYS_fork,%EAX
int $0×80
test %EAX,%EAX
jz _cont1
xorl %EBX,%EBX # EBX=status code
xorl %EAX,%EAX #
incl %EAX # SYS_exit
int $0×80
….
А может надо так ???
см. http://wasm.ru/article.php?article=asmunixlot
Уже теплее .
Задача такая : надо в первую ячейку видеопамяти занести символ 'A' ,
т.е. на экран просто в левом верхнем углу вывести один символ 'A' на черном фоне .
Вот это все уже компилится :
_start:
mov $0xb800,%EAX
mov %EAX,%esi
mov $0×41,%ESI
mov $0×1f1,%ESI
loop1: jmp loop1
Токо вот я не знаю — правильная ли у меня логика : достаточно ли для вывода
на экран скопировать 2 байтика в область памяти , адрес которой хранится в ESI ?
И потом , я не знаю , как сделать приращение , чтобы второй байтик $0×1f1
лег в следующую ячейку памяти , а не в ту же , что и $0×41 ?
Вроде когда-то писали подобную прогу под ДОС, но тут может не получится.
А для увелечения incl где l — значит long тоесть 32 бита.
Хорошо заменить mov на movl.
Эти строки не верные получишь не то что хотел
mov $0×41,%ESI
mov $0×1f1,%ESI
Надо помоему так
movl $0×41,(%ESI)
movl $0×1f1,(%ESI)
…
Но я асмом на лине давно не занимался —
см. исходники ядра.
см. доки по асму для линуха.
см. gcc -S *.c
То что пишется в видеопамять(ну или то что доступно с 0xb800) сразу же выводиться на экран, при условии что ты пишешь именно в current screen, которых как известно 4.
PS
Все это канает для DOS->Win->WinNT. Полагаю что и для UNIX тоже ибо железо одно на всех.