Помогите с загрузчиком
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
но почему он выводит вообще другую инфу
; в 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
З.Ы. только что-то ещё с адресом видеопамяти надо придумать...
в Си это выглядело, как
как это сделать в асме, не особо соображу, наверно что-то вроде
mov es, 0
mov es:[dx], byte al
Вывод символов в MBR обычно делается функцией 0eh 10h прерывания. Только не забыть положить в BH номер страницы (0). Советую дизассемблировать готовый MBR от MS, IBM или ещё кого и посмотреть, как он устроен.
Либо как сказали выше, прямым выводом в видеопамять, выбор метода - в зависимости от того, что нужно выводить.
ЗЫ Перед загрузкой SS cli можно не делать, сделается само.
; 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
вызывается так:
call print
когда я делая lea или offset, то он не правльную инфу выводит
mov si, 0x7C00 + String
ты так делал?
а org 0x7c00 мне как-то непонятно, зачем нужен. POST и так грузит по адресу 0x7c00.
З.Ы. про org вспомнил - какой ассемблер то? nasm?
а org 0x7c00 мне как-то непонятно, зачем нужен. POST и так грузит по адресу 0x7c00.
ты наверно забыл что дирректива org 0x7c00 делает так чтобы все последующие символьные ссылки были относительно 0x7c00, поэтому не надо mov si, 0x7C00 + String, можно ппосто mov si, String
и насколько я понял, он использует TASM
и насколько я понял, он использует TASM
не, просто глянь доки - в nasm'е директива org отличается от прочих. Поэтому и
[QUOTE=~ArchimeD~]З.Ы. про org вспомнил - какой ассемблер то? nasm?[/QUOTE]
хотя, выполняет на вид неотличимую функцию. прошу прощения, запамятовал :D
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
но все равно не выводит то, что нужно
2. Неплохо бы выравнивать размер на 512 байт и дописывать в конец Uк, если конечно записывающая программа этого не делает. Вот мой код:
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
Батник для ассемблирования
tlink /t/x !.obj, !.dat
del !.obj
но есть один вопрос: почему mov bx,7
если ты пишешь бут-сектор, то у тебя проц изначально находится в реальном 16-битном режиме. и соответственно использовать можно только 16-битные регистры.
переходить в защищенный режим в бутсекторе - не есть хорошо (имхо), лучше все это сделать во вторичном загрузчике
и я не знаю каким ты образом пишешь этот загрузчик. в nasm перед 32-битным кодом нужно ставить [BYTE 32]
.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 в отдельном экзешнике, то как его загрузить в память и передать на него управление?
Именно это я говорил автору аналогичной темы на wasm.ru.
Я nasm не использую, но по-моему там [BITS 32]...
Vov4ick, там чисто образ дискеты без файловой системы.
...
Именно это я говорил автору аналогичной темы на wasm.ru.
...
Я nasm не использую, но по-моему там [BITS 32]...
ну я на васме, често говоря, не обитаю...
насчет [BITS 32] - точно, это я лоханулся, получилось 32 байта вместо бит :o мои пардоны, спасибо что поправил
ну так может выложишь полный ответ твоего линкера?
2.asm -это мой файл
org 7C00h
; здесь нужно вписать 16-разрядный код
use32
; здесь при желании можно вписать 32-разрядный код
rb 7DFEh-$
dw 0AA55h
Заранее признателен.
там в конце документа есть немного про форматы в том числе и MZ
в том документе и про это есть
extra characters on line
прямая ссылка на него - http://www.wasm.ru/docs/6/fasm164manualrus.zip
в FASM директивы offset нет
mov eax, metka ; в eax будет смещение этой метки
точка входа определяется так
entry metka
illegal instruction ??? Не скажите вчем проблема, заранее спасибо за помощь
и вопрос: чтобы найти какие либо файлы на дискете мне нужно изучить FAT12?