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

Ваш аккаунт

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

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

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

Помогите с загрузчиком

1.8K
29 сентября 2007 года
Evgeni
188 / / 14.06.2006
Пишу простой загрузчик, но столкунулся с такой проблемой, как вывести символы

IDEAL
model tiny

codeseg
start:
xor ax,ax
cli
mov ax,cs
mov ss,ax
mov ds,ax
lea sp,[start]
sti

mov si,offset msg
mov ah,0eh
lodsb ;здесь должны
int 10h ;были вывестись
lodsb ;три символа
int 10h ;
lodsb ;
int 10h ;

cli
hlt

msg:
db 'abs'
end start

но почему он выводит вообще другую инфу
Страницы:
391
29 сентября 2007 года
Archie
562 / / 03.02.2005
А если в ds загрузить 0x07C0?.. И org 0 указать...
245
29 сентября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
вот тебе моя процедра вывода строки в pm. можно переделать под 16-битный (в общем только регистры урезать), а этот использовать, когда в pm перейдешь.

Код:
; процедура печати строки, пишет напрямую в видеопамять, начиная с адреса 0xb8000
; в esi заносится переменая, в которой хранится начало строки
; параметры заносятся в стек: 1) цвет
;                                                  2) X
;                                                  3) Y
.Print32
    pushad              ; занимает 32 байта
.get_param0:
    mov ecx, [esp+36]       ; первый параметр(x)
    mov eax, ecx
    mov ecx, 160
    mul ecx
    mov edx, [esp+40]       ; второй параметр(y)
    shl edx, 1
    add edx, eax
    add edx, 0xb8000    ; в edx у нас теперь нужный для символа адрес
.print_char0:
    lodsb
    test al, al
    jz short .exit1
    mov [edx], byte al
    inc edx
    mov ax, [esp+44]
    mov [edx], byte al
    inc edx
    jmp short .print_char0
.exit1:
    popad
ret 12


З.Ы. только что-то ещё с адресом видеопамяти надо придумать...
в Си это выглядело, как
 
Код:
char far *video_mem = (char far*)0xb8000000


как это сделать в асме, не особо соображу, наверно что-то вроде
 
Код:
mov dx, 0xb8000
mov es, 0
mov es:[dx], byte al
1.6K
30 сентября 2007 года
Vov4ick
476 / / 01.02.2007
Во-первых забыли org 7c00h
Вывод символов в MBR обычно делается функцией 0eh 10h прерывания. Только не забыть положить в BH номер страницы (0). Советую дизассемблировать готовый MBR от MS, IBM или ещё кого и посмотреть, как он устроен.
Либо как сказали выше, прямым выводом в видеопамять, выбор метода - в зависимости от того, что нужно выводить.
ЗЫ Перед загрузкой SS cli можно не делать, сделается само.
1.8K
30 сентября 2007 года
Evgeni
188 / / 14.06.2006
а можно пожалуйста полный код, т.к все равно не получается, хоть и добавил org 7c00h
245
30 сентября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
йа тут покопался в своих сорцах, нашел ещё:

Код:
; Процедура вывода ASCIIZ строки на экран
; ds:si - адрес строки
print:
        pusha
print_char:
        lodsb   ; Читаем очередной символ
        test    al, al  ; 0 - конец?
        jz      short pr_exit   ; Да конец
        ; Нет, выводим этот символ
        mov     ah, 0eh
        mov     bl, 2
        int     10h
        jmp     short print_char        ; Следующий
pr_exit:
        popa
ret


вызывается так:
 
Код:
mov     si, 0x7C00 + String
        call    print
1.8K
30 сентября 2007 года
Evgeni
188 / / 14.06.2006
мне не нужен сам код вывода строки, мне нужно правльно настроить смещение
когда я делая lea или offset, то он не правльную инфу выводит
245
30 сентября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
ну так если у тебя загрузчик загружен по адресу 0x7c00, то соответственно и помещать надо:

mov si, 0x7C00 + String

ты так делал?
а org 0x7c00 мне как-то непонятно, зачем нужен. POST и так грузит по адресу 0x7c00.

З.Ы. про org вспомнил - какой ассемблер то? nasm?
261
30 сентября 2007 года
ahilles
1.5K / / 03.11.2005
Цитата: ~ArchimeD~

а org 0x7c00 мне как-то непонятно, зачем нужен. POST и так грузит по адресу 0x7c00.


ты наверно забыл что дирректива org 0x7c00 делает так чтобы все последующие символьные ссылки были относительно 0x7c00, поэтому не надо mov si, 0x7C00 + String, можно ппосто mov si, String

и насколько я понял, он использует TASM

245
30 сентября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: ahilles
ты наверно забыл что дирректива org 0x7c00 делает так чтобы все последующие символьные ссылки были относительно 0x7c00, поэтому не надо mov si, 0x7C00 + String, можно ппосто mov si, String

и насколько я понял, он использует TASM



не, просто глянь доки - в nasm'е директива org отличается от прочих. Поэтому и
[QUOTE=~ArchimeD~]З.Ы. про org вспомнил - какой ассемблер то? nasm?[/QUOTE]
хотя, выполняет на вид неотличимую функцию. прошу прощения, запамятовал :D

1.8K
01 октября 2007 года
Evgeni
188 / / 14.06.2006
Код:
model tiny

codeseg
start:
start1:
   jmp vpered
   msg db 'ab'
   vpered:
   cli
   xor ax,ax
   mov ss,ax
   lea sp,[start1]  
   sti
   
   xor bh,bh
   mov ah,0eh
   lea si,msg
   add si,7c00h
   lodsb
   int 10h
  lodsb
   int 10h
   
   cli
   hlt
   

end start

но все равно не выводит то, что нужно
1.6K
01 октября 2007 года
Vov4ick
476 / / 01.02.2007
1. Не настроен DS
2. Неплохо бы выравнивать размер на 512 байт и дописывать в конец Uк, если конечно записывающая программа этого не делает. Вот мой код:
Код:
ideal
model tiny
codeseg
org 7c00h
start:
                xor     ax,ax
                mov     ss,ax
                mov     sp,7c00h
                mov     ds,ax
                mov     es,ax
;-------------- ------- -------------------
                mov     si,offset message
                call    write_message
                cli
                hlt
;------------------------------------------
write_message:
                lodsb
                or      al,al
                jz      end_mes
                mov     ah,0eh
                mov     bx,7
                int     10h
                jmp     write_message
end_mes:
                ret
; ---------------------------------------
message db 'My code is working',13,10
        db 'Press reset to continue . . .',0

db 512 - ( $ - start ) -2 dup (0)
db 55h,0aah

end start

Батник для ассемблирования
 
Код:
tasm /m9/z !.!
tlink /t/x !.obj, !.dat
del !.obj
1.8K
01 октября 2007 года
Evgeni
188 / / 14.06.2006
спасибо большое, этот код действительно работает,
но есть один вопрос: почему mov bx,7
1.6K
01 октября 2007 года
Vov4ick
476 / / 01.02.2007
Как я писал выше - 0 страница видеопамяти, цвет 7 (не знаю для чего, т.к. цвет задается только при выводе в графическом режиме, но все стандартные бут-сектора так делают, видимо из совместимости)
33K
07 октября 2007 года
klat
1 / / 07.10.2007
Да из-за совместимости и не только бут-сектора
1.8K
12 октября 2007 года
Evgeni
188 / / 14.06.2006
Уважаемые, а почему когда я использую 32 битные регистры, то линкер не хочет линковать, что делать?
245
12 октября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: Evgeni
Уважаемые, а почему когда я использую 32 битные регистры, то линкер не хочет линковать, что делать?



если ты пишешь бут-сектор, то у тебя проц изначально находится в реальном 16-битном режиме. и соответственно использовать можно только 16-битные регистры.

1.8K
12 октября 2007 года
Evgeni
188 / / 14.06.2006
я в бут секторе в дальейшем пишу переход в защищенный режим, но когда хочу создать бинарник, то линкер не хочет создавать файл
245
12 октября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: Evgeni
я в бут секторе в дальейшем пишу переход в защищенный режим, но когда хочу создать бинарник, то линкер не хочет создавать файл



переходить в защищенный режим в бутсекторе - не есть хорошо (имхо), лучше все это сделать во вторичном загрузчике

и я не знаю каким ты образом пишешь этот загрузчик. в nasm перед 32-битным кодом нужно ставить [BYTE 32]

1.8K
12 октября 2007 года
Evgeni
188 / / 14.06.2006
делаю загрузчик вот так
Код:
model tiny
.386p



codeseg
org 7c00h


start:
                xor     ax,ax
                mov     ss,ax
                mov     sp,7c00h
                mov     ds,ax
                mov     es,ax

;------------загружаем остальные сектора---

                ;пропустим
                mov ah,02h
                mov al,100
                xor ch,ch
                mov cl,2
                xor dx,dx
               
                mov bx,offset start
                add bx,512
                int 13h

;------------------------------------------

;------------------открываем линию А20-----

                in al,92h
                or al,2
                out 92h,al

;------------------------------------------

                xor eax,eax
                mov ax,PM_code
                shl eax,4
                add eax,offset entry_point
                mov dword ptr ENTRY_OFF,eax
               
               
                xor eax,eax
                lea ax,start
                shl eax,4
                add ax,offset GDT
               
                mov dword ptr GDTR+2,eax
               
                lgdt fword ptr GDTR
               
                cli
               
                in al,70h
                or al,80h
                out 70h,al
               
                mov eax,CR0
                or al,1
                mov CR0,eax
; ---------------------------------------

db      66h            
        db  0EAh           
ENTRY_OFF   dd  ?          
        dw  00001000b      




GDT:
NULL_descr    db 8 DUP(0)
CODE_descr    db 0FFh,0ffh,00h,00h,00h,10011010b,11001111b,00h
DATA_descr    db 0FFh,0ffh,00h,00h,00h,10010010b,11001111b,00h
VIDEO_descr   db 0FFh,0ffh,00h,80h,0Bh,10010010b,01000000b,00h
GDT_size      equ $-GDT

GDTR          dw  GDT_size-1
              dd  ?

db 55h,0aah




PM_code   segment para 'code' use32
          assume CS:PM_code,DS:PM_data
         
entry_point:
          mov ax,00010000b
          mov ds,ax
          mov ax,00011000b
          mov es,ax
                   
          xor si,si          
          mov si,PM_data
          shl esi,4
          add esi,offset message_1
          xor edi,edi
          mov ecx,mes_len
         
          rep movsb
          jmp $
PM_code   ends


RM_stack      segment          para stack 'STACK' use16
           db          100h dup(?)                  
RM_stack       ends

PM_data   segment para public 'DATA' use32
          assume  CS:PM_data
message_1:
irpc      mes,
          db '&mes&',0dh          
endm
mes_len    equ $-message_1

PM_data  ends


          end start


а если сделать переход в PM в отдельном экзешнике, то как его загрузить в память и передать на него управление?
1.6K
12 октября 2007 года
Vov4ick
476 / / 01.02.2007
Хм... А где в этом бут секторе информация о структуре диска? Бут-сектор должен загружать основной загрузчик (из файла или зарезервированных секторов), который уже ставит защ. режим и подгружает всё остальное.
1.8K
12 октября 2007 года
Evgeni
188 / / 14.06.2006
можешь написать подробнее по шагам, что я должен сделать, а то я че-то не понимаю
261
12 октября 2007 года
ahilles
1.5K / / 03.11.2005
ну допустим у тебя есть несколько секторов на HDD в которых находится какой-то 32 битный код, лучше просто бинарный файл без каких либо заголовков, ты просто его загружаешь в память (с помощью того же самого 13h прерывания) и передаёшь на него управление, вот и всё. Следует подметить, что в загружаемаемом коде все сслыки должны быть относительно того адреса куда ты его загружаешь
349
12 октября 2007 года
Phantom-84
656 / / 27.10.2005
Evgeni, знакомый исходник, однако, - его на днях форуме wasm.ru уже выкладывали и комментировали!

Цитата:
переходить в защищенный режим в бутсекторе - не есть хорошо (имхо), лучше все это сделать во вторичном загрузчике

Именно это я говорил автору аналогичной темы на wasm.ru.

Цитата:
и я не знаю каким ты образом пишешь этот загрузчик. в nasm перед 32-битным кодом нужно ставить [BYTE 32]

Я nasm не использую, но по-моему там [BITS 32]...

Цитата:
А где в этом бут секторе информация о структуре диска?

Vov4ick, там чисто образ дискеты без файловой системы.

349
12 октября 2007 года
Phantom-84
656 / / 27.10.2005
Хотел дать ссылку, но эта тема по непонятным мне причинам испарилась с wasm.ru. Странно...
245
12 октября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: Phantom-84

...
Именно это я говорил автору аналогичной темы на wasm.ru.
...
Я nasm не использую, но по-моему там [BITS 32]...



ну я на васме, често говоря, не обитаю...

насчет [BITS 32] - точно, это я лоханулся, получилось 32 байта вместо бит :o мои пардоны, спасибо что поправил

1.8K
12 октября 2007 года
Evgeni
188 / / 14.06.2006
дейстивтельно, я на wasm задал такой же вопрос, но там нормально не ответили, здесь более понятные ответы, но все же ни кто так и не ответил на вопрос: у меня не копилится бинарник, если я в нем использую 32 битный код, какие дополнительные параметры нужно выставить?
245
12 октября 2007 года
~ArchimeD~
1.4K / / 24.07.2006
Цитата: Evgeni
дейстивтельно, я на wasm задал такой же вопрос, но там нормально не ответили, здесь более понятные ответы, но все же ни кто так и не ответил на вопрос: у меня не копилится бинарник, если я в нем использую 32 битный код, какие дополнительные параметры нужно выставить?



ну так может выложишь полный ответ твоего линкера?

1.8K
13 октября 2007 года
Evgeni
188 / / 14.06.2006
Ответ таков: Fatal: 32-bit record encountered in module 2.asm
2.asm -это мой файл
349
13 октября 2007 года
Phantom-84
656 / / 27.10.2005
Evgeni, лично я на wasm.ru подробно прокомментировал твою проблему и этот исходник, но мои комментарии почему-то не были учтены! Юзай фасм и не парься:
 
Код:
; бинарный формат и разрядность по умолчанию 16 бит
org 7C00h
; здесь нужно вписать 16-разрядный код
use32
; здесь при желании можно вписать 32-разрядный код
rb 7DFEh-$
dw 0AA55h
1.8K
13 октября 2007 года
Evgeni
188 / / 14.06.2006
ладно, убедил Phantom-84, но раз так, то не скажешь ли, где найти руководство, как пользоваться фасмом, ведь в тасме я писал codeseg, dataseg, модель памяти указывал, делал exe,com, а как это все делать в фасме?
Заранее признателен.
261
14 октября 2007 года
ahilles
1.5K / / 03.11.2005
смотри http://forum.codenet.ru/showpost.php?p=151581
там в конце документа есть немного про форматы в том числе и MZ
1.8K
14 октября 2007 года
Evgeni
188 / / 14.06.2006
спасиб, но я имел ввиду еще и синтаксис, как на нем проги писать?
261
14 октября 2007 года
ahilles
1.5K / / 03.11.2005
Цитата: Evgeni
спасиб, но я имел ввиду еще и синтаксис, как на нем проги писать?


в том документе и про это есть

1.8K
14 октября 2007 года
Evgeni
188 / / 14.06.2006
я конечно понимаю, здесь собрались одни гении, но все же я не понял как определить метки, вот допустим в моей проге есть метка входа, как её определить?
252
14 октября 2007 года
koderAlex
1.4K / / 07.09.2005
metka:
1.8K
15 октября 2007 года
Evgeni
188 / / 14.06.2006
но когда в fasme я пытаюсь сделать lea dx,metka или offset то он пишет
extra characters on line
261
15 октября 2007 года
ahilles
1.5K / / 03.11.2005
в том документе всё написано!!!!!!!
прямая ссылка на него - http://www.wasm.ru/docs/6/fasm164manualrus.zip
в FASM директивы offset нет
mov eax, metka ; в eax будет смещение этой метки
точка входа определяется так
entry metka
1.8K
15 октября 2007 года
Evgeni
188 / / 14.06.2006
блин, вроде с метками разобрался,( извните что так часто спрашиваю, просто привыкнуть не могу не как), а не скажите ли, почему когда я хочу сделать бинарник, то при обявлении сегмента компиль пишет
illegal instruction ??? Не скажите вчем проблема, заранее спасибо за помощь
349
16 октября 2007 года
Phantom-84
656 / / 27.10.2005
Evgeni, сегмент - это понятие весьма размытое. В fasm'е директиву segment можно использовать только для формата MZ. Для современных форматов чаще используется понятие секция. В бинарном формате ты просто используешь директиву org (она в fasm'е работает немного иначе, чем в других ассемблерах). К примеру, если предполагается с текущей позиции бинарника "начать новый сегмент", то ты просто пишешь org 0 и все. Если нужен 32-разрядный сегмент кода - приписываешь use32. И еще: в fasm-пакет всегда входит документация на английском языке.
1.8K
16 октября 2007 года
Evgeni
188 / / 14.06.2006
благодарю, а что вы имели ввиду, говоря что org работает иначе?
и вопрос: чтобы найти какие либо файлы на дискете мне нужно изучить FAT12?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог