Форум программистов, компьютерный форум, киберфорум
Assembler, MASM, TASM
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.63/30: Рейтинг темы: голосов - 30, средняя оценка - 4.63
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
1

небольшой загузчик

30.01.2013, 15:11. Показов 6022. Ответов 70
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
набросал загрузчик, через Hex Editor Neo загнал его в самое начало ima-образа дискеты, но он не работает... как правильно его туда записать, чтобы загрузка проходила нормально?

Код
//hex-dump загрузчика
eb 3c 90 46 45 6c 6f 61 64 65 72 00 02 01 01 00	
02 e0 00 40 0b f0 09 00 12 00 02 00 00 00 00 00	
00 00 00 00 00 00 29 00 00 00 00 00 00 00 00 00
00 00 00 00 00 00 46 41 54 31 32 20 20 20 8c c8
8e d8 be 55 01 fc b4 0e b7 00 ac 84 c0 74 04 cd
10 eb f7 eb fe 48 65 6c 6c 6f 20 57 6f 72 6c 64
21 00
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
;сам загрузчик
.model tiny
.code
    org 100h
start:
    jmp Loader
    
signatura       db 'FEloader'   ;сигнатура изготовителя ОС 
Sectorsize      dw 200h         ;512 байт на сектор
sizeClaster     db 1            ;размер кластера в секторах
clasterCount    dw 1            ;число кластеров до первой ФАТ
FATCount        db 2            ;число ФАТ
count           dw 224          ;число записей в корневом каталоге
countSector     dw 2880         ;Полное число секторов на диске
pole            db 0F0h         ;байт описания носителя
FATSize         dw 9            ;размер ФАТ в секторах
SectorCount     dw 18           ;Кол-во секторов на дорожке
golovok         dw 2            ;число головок
hediSector      dd 0            ;число скрытых секторов
sectorov        dd 0            ;число секторов на диске
nnnnnnnn        db 0h           ;тут по идее 80h-первый жесткий диск, ставлю нуль
reserved        db 0            ;зарезервированно
bootsector      db 29h          ;сигнатура расширенного Boot-сектора
serial          dd ?            ;серийный номер тома (дается при форматировании)
metkaToma       db 11 dup (?)   ;метка тома
FileSystem      db 'FAT12   '   ;тип файловой системы
 
Loader:
    mov  ax, cs
      mov  ds, ax ; выбираем сегмент данных
  
      mov  si, offset message
cld ; направление для строковых команд
      mov  ah, 0Eh  ; номер функции BIOS
      mov  bh, 00 ; страница видеопамяти
 puts_loop:
      lodsb ; загружаем очередной символ в al
      test al, al ; нулевой символ означает конец строки
      jz   puts_loop_exit
      int  10h ; вызываем функцию BIOS
      jmp  puts_loop
 puts_loop_exit:
      jmp  $ ; вечный цикл
  
 message:
      db   'Hello World!',0
end start
в аттаче фотка с тем, что получилось.
Миниатюры
небольшой загузчик  
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
30.01.2013, 15:11
Ответы с готовыми решениями:

Нужен небольшой совет
Здравствуйте! Когда-то пробовал начать изучать ассемблер. На тот момент читал книжку Крупника....

Небольшой загрузчик
Здравствуйте У меня есть bin файл. И мне надо его как-то запустить из кода asm(fasm). Решил...

Небольшой ступор
Столкнулся с небольшой проблемой. Есть форма, на ней находятся несколько OptionButton-ов, в ячейках...

Небольшой Converter
Я полный 0 в C# занимаюсь моддингом в игре Tony Hawk's American Wasteland... Нужен конвертер в...

70
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
30.01.2013, 15:14  [ТС] 2
пускаю в виртуал боксе, машина просто встает. ничего не делает...
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
30.01.2013, 15:23 3
Fatal Error, вот, писал как-то на досуге. Попробуй этот код.
Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
.model tiny
.code
org 7c00h
start:
cli
mov ax,cs
mov ds,ax
mov es,ax
sti
mov ax,3
int 10h
mov bx,0ch
mov ax,1301h
mov dx,0a00h
mov bp,offset string
mov cx,sizeof string
int 10h
 
xor ax,ax
int 16h
int 18h
 
string db 'HELLO Woody!'
db (510-($-start)) dup (0)
dw 0aa55h
end start
1
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
30.01.2013, 16:05  [ТС] 4
да, текст есть, но какой-то не тот... я наверное что-то не так делаю... как правильно забить его в корень образа?
0
64 / 64 / 0
Регистрация: 06.10.2011
Сообщений: 299
30.01.2013, 16:21 5
http://ziplib.com/emu8086/
вот тут в эммуляторе есть работающий пример мини оси, загрузчик и утилита для его записи на дискету, подключи образ как флоппи диск виртуальным драйвером и запиши туда. на железе работает и на виртуалке тоже
1
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
30.01.2013, 16:30 6
Fatal Error, com файл переименуй в .img. Подключи к VirtualBox. Убери загрузку с остальных носителей.
Миниатюры
небольшой загузчик  
1
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
30.01.2013, 17:10  [ТС] 7
все сделал!!! через фасм норм, тасм не дает сделать org 7C00h
0
1127 / 261 / 9
Регистрация: 11.06.2010
Сообщений: 1,049
30.01.2013, 17:24 8
Цитата Сообщение от Fatal Error Посмотреть сообщение
все сделал!!! через фасм норм, тасм не дает сделать org 7C00h
Дает. Просто указывай расширение BIN у выходного файла, ибо он(TASM) вредный
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
30.01.2013, 17:29 9
Fatal Error, я masm32 собирал.
c:\Program Files\Bochs-2.4.6>ml /omf /Zm c.asm
Microsoft (R) Macro Assembler Version 10.00.30319.01
Copyright (C) Microsoft Corporation. All rights reserved.

Assembling: c.asm

c:\Program Files\Bochs-2.4.6>link16 /t c.obj,c.img;

Microsoft (R) Segmented Executable Linker Version 5.60.339 Dec 5 1994
Copyright (C) Microsoft Corp 1984-1993. All rights reserved.

LINK : warning L4055: start address not equal to 0x100 for /TINY
0
Ушел с форума
Автор FAQ
16281 / 7605 / 1066
Регистрация: 11.11.2010
Сообщений: 13,618
30.01.2013, 17:34 10
sh2ezo,
а как в masm создать com-файл, чтобы в начале стояло "org 400000h"?
0
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
30.01.2013, 17:41  [ТС] 11
Vadimych, тасм не дает. он говорит мол неверная точка входа в ком-проге. а фасм без проблем съел код!!!
0
639 / 482 / 12
Регистрация: 10.01.2011
Сообщений: 1,045
30.01.2013, 18:06 12
Fatal Error, я тебе об masm32, ты мне об tasm. И тасм даёт, ты просто просить не умеешь.
d:\DOSPROG\TASM>tasm 5
Turbo Assembler Version 4.1 Copyright (c) 1988, 1996 Borland International

Assembling file: 5.ASM
Error messages: None
Warning messages: None
Passes: 1
Remaining memory: 451k


d:\DOSPROG\TASM>tlink /t 5.obj,5.bin
Turbo Link Version 7.1.30.1. Copyright (c) 1987, 1996 Borland International
sh2ezo писал же тебе.
0
64 / 64 / 0
Регистрация: 06.10.2011
Сообщений: 299
30.01.2013, 18:32 13
Создание загрузочного сектора
;===================== Загрузочный сектор. Евгений Попов, 2011=====================
;=============================================================================== ===

.model tiny ;для того чтобы masm скомпилировал односегментную программу не более 512 байт
CSEG segment
assume CS:CSEG

org 7c00h ;BIOS производит чтение 512 байт первого сектора MBR в ОЗУ по адресу 0x00007C00
;(0x07C0:0x0000 в формате реального режима), затем прочитанному коду передаётся управление
start:
http://metanit.com/assembler/articles/Boot.php
так же как ком программу похоже надо компилировать с /TINY
0
sh2ezo
30.01.2013, 18:46
  #14

Не по теме:

Цитата Сообщение от Mikl___ Посмотреть сообщение
sh2ezo,
а как в masm создать com-файл, чтобы в начале стояло "org 400000h"?
Это прикол такой?

0
64 / 64 / 0
Регистрация: 06.10.2011
Сообщений: 299
30.01.2013, 18:51 15
вот я взял пример из эмулятора. ядро системы скомпилил на эмуляторе, а бут сектор на масме. там пришлось кое что подправлять в синтаксисе, возможно чета накосячил потому что ядро не грузится, но бутсектор скомпилился и грузится. надо проверять что я там напрвил. проверял подключив образ флоппи диска виртуальным драйвером записал туда бутсектор и ядро, а запускал на виртуалке
Вложения
Тип файла: zip 07с0.zip (10.2 Кб, 8 просмотров)
0
64 / 64 / 0
Регистрация: 06.10.2011
Сообщений: 299
30.01.2013, 19:20 16
Код
cmp    byte ptr es:[0000h],0E9h  ; first byte of kernel must be 0E9 (jmp).
одну ошибку нашел не ворд а байт

Добавлено через 11 минут
поковыряйтесь кто нибудь свежим взглядом. на три байта код отличается а не могу ошибки найти
0
608 / 406 / 8
Регистрация: 26.04.2012
Сообщений: 2,065
30.01.2013, 23:31  [ТС] 17
bomz, в приведенном архиве в файле micro-os_loader 75 строка
Assembler
1
2
; initialize the stack:
mov     ax, 07c0h
там наверное должно быть 7c00h... или там все норм?
0
64 / 64 / 0
Регистрация: 06.10.2011
Сообщений: 299
31.01.2013, 00:30 18
хм не готов ответить. но в эмуляторе естественно все копилится. можно код побайтно сравнить в 16 ричном редакторе или дезассемблировать в одном дезасемблере

Добавлено через 32 минуты
Код
; boot record is loaded at 0000:7c00
org 7c00h

; initialize the stack:
mov     ax, 07c0h
mov     ss, ax
mov     sp, 03feh ; top of the stack.
нет все правельна. потому что образуется стек и устанавливается сегментный регистр, а он с начала параграфа(?) начинается то есть на 16 надо поделить - или нолик откинуть в 16ричной системе

Добавлено через 3 минуты
надо дезасемблировать найти ошибку. ну сделайте кто нибудь. компилируется скорее всего правильно потому что на несколько байт различается, так что ошибка в смене синтаксиса, у эммулятора есть даже свои примочки - указания компилятору через директивы, и еще вот это w. = word ptr , b. = byte ptr

Добавлено через 17 минут
дезассемблировал - дело все таки в компиляции
0
64 / 64 / 0
Регистрация: 06.10.2011
Сообщений: 299
31.01.2013, 01:26 19
не получается ни хрена, только добился что org 0h делается.
Вложения
Тип файла: zip boot.zip (172.9 Кб, 3 просмотров)
0
64 / 64 / 0
Регистрация: 06.10.2011
Сообщений: 299
31.01.2013, 02:11 20
зделал дурацкая ошбка как обычно.

Кликните здесь для просмотра всего текста
Код
     name "loader"
; this is a very basic example of a tiny operating system.

; directive to create boot file:
;   #make_boot#

; this is an os loader only!
;
; it can be loaded at the first sector of a floppy disk:

;   cylinder: 0
;   sector: 1
;   head: 0



;=================================================
; how to test micro-operating system:
;   1. compile micro-os_loader.asm
;   2. compile micro-os_kernel.asm
;   3. compile writebin.asm
;   4. insert empty floppy disk to drive a:
;   5. from command prompt type:
;        writebin loader.bin
;        writebin kernel.bin /k
;=================================================


;
; The code in this file is supposed to load
; the kernel (micro-os_kernel.asm) and to pass control over it.
; The kernel code should be on floppy at:

;   cylinder: 0
;   sector: 2
;   head: 0

; memory table (hex):
; -------------------------------
; 07c0:0000 |   boot sector
; 07c0:01ff |   (512 bytes)
; -------------------------------
; 07c0:0200 |    stack
; 07c0:03ff |   (255 words)
; -------------------------------
; 0800:0000 |    kernel
; 0800:1400 | 
;           |   (currently 5 kb,
;           |    10 sectors are
;           |    loaded from
;           |    floppy)
; -------------------------------


; To test this program in real envirinment write it to floppy
; disk using compiled writebin.asm
; After sucessfully compilation of both files,
; type this from command prompt:   writebin loader.bin   

; Note: floppy disk boot record will be overwritten.
;       the floppy will not be useable under windows/dos until
;       you reformat it, data on floppy disk may be lost.
;       use empty floppy disks only.


; micro-os_loader.asm file produced by this code should be less or
; equal to 512 bytes, since this is the size of the boot sector.

;.model tiny
CSEG segment
assume CS:CSEG

; boot record is loaded at 0000:7c00

org 7c00h
start:

; initialize the stack:
mov     ax, 07c0h
mov     ss, ax
mov     sp, 03feh ; top of the stack.


; set data segment:
xor     ax, ax
mov     ds, ax

; set default video mode 80x25:
mov     ah, 00h
mov     al, 03h
int     10h

; print welcome message:
lea     si, msg
call    print_string

;===================================
; load the kernel at 0800h:0000h
; 10 sectors starting at:
;   cylinder: 0
;   sector: 2
;   head: 0

; BIOS passes drive number in dl,
; so it's not changed:

mov     ah, 02h ; read function.
mov     al, 10  ; sectors to read.
mov     ch, 0   ; cylinder.
mov     cl, 2   ; sector.
mov     dh, 0   ; head.
; dl not changed! - drive number.

; es:bx points to receiving
;  data buffer:
mov     bx, 0800h   
mov     es, bx
mov     bx, 0

; read!
int     13h
;===================================

; integrity check:
cmp    byte ptr es:[0000h],0E9h  ; first byte of kernel must be 0E9 (jmp).
je     integrity_check_ok

; integrity check error
lea     si, err
call    print_string

; wait for any key...
mov     ah, 0
int     16h

; store magic value at 0040h:0072h:
;   0000h - cold boot.
;   1234h - warm boot.
mov     ax, 0040h
mov     ds, ax
mov     word ptr ds:[0072h], 0000h ; cold boot.
;jmp	0ffffh:0000h	     ; reboot!
db 0EAh,  0h, 0h, 0ffh, 0ffh
;===================================

integrity_check_ok:
; pass control to kernel:
;jmp     0800h:0000h
db 0EAh,  0h, 0h, 0h, 08h
;===========================================



print_string proc near
push    ax      ; store registers...
push    si      ;
next_char:      
        mov     al, [si]
        cmp     al, 0
        jz      printed
        inc     si
        mov     ah, 0eh ; teletype function.
        int     10h
        jmp     next_char
printed:
pop     si      ; re-store registers...
pop     ax      ;
ret
print_string endp

                       
                       
                       
;==== data section =====================

msg  db "Loading...",0Dh,0Ah, 0 
     
err  db "invalid data at sector: 2, cylinder: 0, head: 0 - integrity check failed.", 0Dh,0Ah
     db "refer to tutorial 11 - making your own operating system.", 0Dh,0Ah
     db "System will reboot now. Press any key...", 0
    
;======================================
codeend:
db 510-(codeend-start) dup (?)
db 055h,0AAh
CSEG ends
end start


Код
@ECHO OFF
COLOR 9F
cd /d %~dp1
C:\masm32\bin\ml.exe /omf %~s1
C:\masm32\bin\LINK16.EXE /tiny %~sn1.obj,%~sn1.bin,nul,,,
del %~sn1.obj
pause
Код
CSEG segment
assume CS:CSEG
org 7c00h
start:
mov     ax, 07c0h
mov     ss, ax
mov     sp, 03feh
............................
CSEG ends
end start
весь сикретик был в том чтоб указать линковщику имя bin
Вложения
Тип файла: zip PBR.zip (173.6 Кб, 6 просмотров)
0
31.01.2013, 02:11
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
31.01.2013, 02:11
Помогаю со студенческими работами здесь

Небольшой баг
Дана очень простая задачка: Даны числа a0, X, Y, M. Рассмотрим бесконечную последовательность ai...

Небольшой тест
добрый день нужен небольшой тест пример вопрос1 ответ1 ответ2 ответ3 ответ4

Небольшой шифровальщик
Помогите разобраться. Очень срочно, простите если не туда пишу. Поймал шивровальщик-вымогатель, и к...

небольшой вопрос.....
подскажите,пожалуйста,что в этой записи обозначает &(амперсант) перед переменными? int dd, mm, yy;...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru