Форум: "Прочее";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
ВнизHello world в ассме Найти похожие ветки
← →
ArtemESC © (2006-02-18 22:52) [0]Доброго времени суток...
Помогите, пожалуйста, сообразить код для masm 6.11.
Любое использвание прерываний исключается...
Вот код - конечно неправильный.;for masm 6.11
title example for boot
.model small
.code
main proc
mov ax, @data
mov ds, ax
mov bx, offset s
mov cx, len
xor ax, ax
J:
mov [0B800h: ax], [bx] ; Здесь возникает ошибка: - "псевдоассемблерная" строка -
;незнаю как её реализовать...
inc ax
inc bx
loop J
L: jmp L
main endp
.data
s db "Hello world!!!"
len = ($ - s)
end main
← →
Джо © (2006-02-18 22:54) [1]Вообще подход неправильный. В видео память должна писать не сама строка, а по схеме: цвет/символ/цвет/символ.
← →
ArtemESC © (2006-02-18 22:59) [2]>>Джо © (18.02.06 22:54) [1]
Точно, код не совсе корректный, а вообще как это сделать?
← →
Nick Denry © (2006-02-18 23:00) [3]А вообще нуже код для DOS или не обязательно?
← →
ArtemESC © (2006-02-18 23:04) [4]>>Nick Denry © (18.02.06 23:00) [3]
Нужен код для boot, а вообще даже для BIOS...
← →
kaZaNoVa © (2006-02-18 23:06) [5]
; #########################################################################
.386
.model flat, stdcall
option casemap :none ; case sensitive
; #########################################################################
include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
; #########################################################################
.code
start:
jmp @F
szDlgTitle db "MASM 32",0
; szMsg db "Min Proga",13,10,"Гы :)",0
szMsg db "Min Proga",0
@@:
push MB_OK
push offset szDlgTitle
push offset szMsg
push 0
call MessageBox
push 0
call ExitProcess
; --------------------------------------------------------
; The following are the same function calls using MASM
; "invoke" syntax. It is clearer code, it is type checked
; against a function prototype and it is less error prone.
; --------------------------------------------------------
; invoke MessageBox,0,ADDR szMsg,ADDR szDlgTitle,MB_OK
; invoke ExitProcess,0
end start
компилять:
@echo off
if exist minimum.obj del minimum.obj
if exist minimum.exe del minimum.exe
\masm32\bin\ml /c /coff /nologo minimum.asm
\masm32\bin\Link /SUBSYSTEM:WINDOWS /MERGE:.rdata=.text minimum.obj > nul
dir minimum.*
pause
← →
Джо © (2006-02-18 23:07) [6]> [2] ArtemESC © (18.02.06 22:59)
> Точно, код не совсе корректный, а вообще как это
> сделать?
Я давно на ассемблере не писал, боюсь облажаться. Подожди "зубров", подскажут.
Вообще, кажется, можно сделать так:
PUSH DS
MOV AX, B800h
MOV DS, AX
XOR BX, BX
MOV CX, [код буквы]
MOV [BX,CX]
POP DS
Кстати, я ошибся, сначала следует символ, затем атрибут.
← →
Джо © (2006-02-18 23:08) [7]> [5] kaZaNoVa © (18.02.06 23:06)
Причем сдесь MessageBox из WiAPI к boot-сектору?!
← →
Джо © (2006-02-18 23:09) [8]> MOV [BX,CX]
Тьху, MOV [BX],CX
← →
ArtemESC © (2006-02-18 23:10) [9]>>kaZaNoVa © (18.02.06 23:06) [5]
Молодец, долго писал? Спасибо конечно, но [4].
← →
kaZaNoVa © (2006-02-18 23:10) [10]Джо © (18.02.06 23:08) [7]
сорри, ошибся, думал нужно для Windows (когда писал [4] еще не видел)
← →
ArtemESC © (2006-02-18 23:13) [11]>>Джо © (18.02.06 23:07) [6]
Похоже, сейчас посмотрю...
← →
Ученик чародея © (2006-02-18 23:32) [12]Int 10H
это графическое прерывание BIOS, вот через него и выводи.
← →
defunct © (2006-02-19 00:48) [13]
; Процедура выводит AsciiZ строку, адрес
; которой помещается в DS:Si, с атрибутом - Ah
; на экран в позицию (Y,X) = (Dh,DL)
Out_AsciiZ_on_screen:
Call Load_Location_Adress
Read_Next_Sumbol:
LodsB
Or AL,AL
Jz Exit_Out_AsciiZ
StosW
Jmp Read_Next_Sumbol
Exit_Out_AsciiZ:
Ret
Load_Location_Adress:
Mov Di,Ax
Mov Ax,0B800H
Mov Es,Ax
Mov Ax,80*2
Mul Dh
Shl Dx,1
Add AL,DL
Adc Ah,0
Xchg Ax,Di ; ES:Di - адрес на экране
Ret
← →
ArtemESC © (2006-02-19 14:50) [14]Вот последняя модификация, с учетом все замечаний, не работает:
;for masm 6.11
title example for boot
.model small
.code
main proc
mov ax, @data
mov ds, ax
mov bx, offset s
mov cx, len
xor bp, bp
J:
mov al, byte ptr [bx]
push ds
mov dx, 0B800h
mov ds, dx
mov ah, 01Fh
mov [bp], ax
pop ds
inc bx
inc bp
loop J
L: jmp L
main endp
.data
s db "Hello world!!!"
len = ($ - s)
end main
← →
Хинт © (2006-02-19 14:59) [15]Вот вывод строки Hello World двумя способами (запись в видео буффер и используя прерывания BIOS). Выводит строку сверху вниз (буквы в столбец) и при этом изменяется только цвет букв, а фон остается прежним. Если такой код устраивает, могу написать сокращенный вариант (вывод в строку с заданными параметрами атрибутов).
CSEG Segment
assume CS:CSEG,DS:CSEG,ES:CSEG,SS:CSEG
org 100h
Start:
call Video
call Bios
int 20h
Video proc
mov ax,0B800h
mov es,ax
mov di,0
mov cx,len
xor si,si
l1:
mov ax,es:[di]
mov al,msg[si]
and ah,11110000b
add ah,00001010b
mov es:[di],ax
add di,160
inc si
loop l1
ret
Video endp
Bios proc
xor si,si
xor bh,bh
mov cx,len
mov dl,2
mov dh,0
l2:
mov ah,2
int 10h
mov ah,8
int 10h
mov bl,ah
and bl,11110000b
add bl,00001110b
mov ah,9
mov al,msg[si]
push cx
mov cx,1
int 10h
pop cx
inc si
inc dh
loop l2
ret
Bios endp
msg db "Hello World",01h
len equ $-msg
CSEG ends
end Start
← →
Чародей © (2006-02-19 16:27) [16]
> mov ax, @data
> mov ds, ax
> mov bx, offset s
> mov cx, len
> xor bp, bp
> J:
> mov al, byte ptr [bx]
> push ds
> mov dx, 0B800h
> mov ds, dx
> mov ah, 01Fh
> mov [bp], ax
> pop ds
Аресацию рекомендуется вести через es, так как ты переопределяешь сегмент собственных данных, в т.ч строки.
...
mov al, byte ptr [bx]
push es ;??
mov dx, 0B800h
mov es, dx
mov ah, 01Fh
mov es:[bp], ax
pop es ;??
...
← →
Defunct © (2006-02-19 16:31) [17]ArtemESC © (19.02.06 14:50) [14]
вы функцию [13] попробуйте. это рабочая функция как раз применялась в загрузчике.
s db "hello world!", 0
и masm засуньте подальше по возможности.
tasm гораздо лучше.
← →
kaZaNoVa © (2006-02-19 16:38) [18]Defunct © (19.02.06 16:31) [17]
и masm засуньте подальше по возможности.
tasm гораздо лучше.
чем это?
имхо наоборот
← →
Defunct © (2006-02-19 16:40) [19]да всем, вплоть до более свободного(развязного) синтаксиса и многопроходной оптимизации кода транслятором.
← →
Defunct © (2006-02-19 16:46) [20]Чародей © (19.02.06 16:27) [16]
О Боже мой! нахрена адрпесовать es через bp?
← →
ArtemESC © (2006-02-19 16:55) [21]Я понял, что я никак не могу правильно расчитать адрес строки,
Bios загружает же 1-ый сектор по адресу 0x7C00, а адрес
строки вычисяется на этапе трансляции - как мне его
получить?
← →
Defunct © (2006-02-19 16:57) [22]ArtemESC © (19.02.06 16:55) [21]
очень просто. -100h.
← →
Defunct © (2006-02-19 17:00) [23]или так:
Start:
Call $+3
Pop Ax
Sub Ax,3
Mov Si,Ax
Push Cs Ax
Mov Ax,07400h
Mov Es,Ax
Push Ax
Mov Di,100h
Mov Cx,OffSet Segment_End
Rep MovsB
Mov Ax,OffSet Entry_Point
Push Ax
RetF
Entry_Point:
← →
Defunct © (2006-02-19 17:32) [24]в общем, вот пример кода загзузчика под tasm, ориентированный под DOS.
писал его очень давно, поэтому код мне самому не очень нравится.
создается com файл, который просто помещается в hdd MBR только так чтобы не запопроть таблицы разделов, либо в boot дискетки.CodeS Segment Byte
Assume CS:Codes
Org 100h
.386
Start:
Call $+3
Pop Ax
Sub Ax,3
Mov Si,Ax
And Ax,0FF00h
Push Cs Ax
Mov Ax,5000h
Mov Es,Ax
Push Ax
Mov Di,100h
Mov Cx,OffSet Segment_End
Rep MovsB
Mov Ax,OffSet Entry_Point
Push Ax
RetF
Entry_Point:
Xor Ax,Ax
Mov Es,Ax
Push Cs
Pop Ds
Mov Di,32
Push Dword Ptr ES:[Di]
Pop DWord Ptr DS:[OffSet Int08_Chain]
Push Cs
Push OffSet Int08_Handler
Pop DWord Ptr ES:[Di]
Add Di,(21h-8h)*4
Push DWord Ptr ES:[Di]
Pop DWord Ptr DS:[OffSet Int21h_Start]
STI
Mov Bp,SP
Les Bx,[Bp]
Mov Ax,0201h
Mov Cx,4F01h
Mov Dx,0100h
Int 13h
RetF
; Обработчик прерывания таймера
Int08_Handler:
PushF
Db 09Ah
Int08_Chain DD ?
PushA
Push DS Es
Push Cs
Pop Ds
; Проверка на наличие операционной системы
Les Di,Int21h_Address
Mov EAx,ES:[Di]
Cmp EAx,Int21h_Start
Jz I8_Normal
Cmp EAx,1000000h
Ja I8_Normal
Mov Ah,4Eh
Mov Si,OffSet MSG_02
Call Out_String
Push Cs
Push OffSet Int21h_Handler
Pop DWord Ptr Int21h_Start
Les Di,Int21h_Address
Mov EAx,Int21h_Start
Xchg ES:[Di],EAx
Mov Int21h_Chain,EAx
Jmp I8_Exit
I8_Normal:
Mov Ah,4Eh
Mov Si,OffSet MSG_01
Call Out_String
I8_Exit:
Pop Es Ds
PopA
IRet
; Временный обработчик Int21h (для однократного монтажа)
Int21h_Handler:
PushAD
Push Ds Es
Push Cs
Pop Ds
Dec FAI21
Jnz I21_Exit
;;;; Загрузка файла драйвера
Mov Ah,48h
Mov Bx,200h ; 200h * 16 байт памяти для драйвера
Call Int21h_Emu
Push Ax
Push 100h ; В стеке адрес сегмента памяти
Pop DWord Ptr DS:[Drv_Location]
Mov Dx,OffSet SS_101
Mov Ax,3D02h
Call Int21h_Emu
Xchg Ax,Bx ; Не помешает проверить на ошибку (CF=1)
Lds Dx,Drv_Location
Mov Ah,3Fh
Mov Cx,99h * 16
Call Int21h_Emu
Mov Ah,3Eh
Call Int21h_Emu ; Закрыть файл драйвера
; Тут драйвер загружен
Les Di,Int21h_Address
Push DWord Ptr CS:[Drv_Location]
Push DWord Ptr CS:[Int21h_Chain]
Pop DWord Ptr DS:[104h]
Pop Dword Ptr ES:[Di]
Mov Ax,Ds
Dec Ax
Mov Ds,Ax
Mov Word Ptr DS:[1],08h
;;; Тут снимаем процедуру слежения Int08_Handler
Mov EAx,CS:Int08_Chain
Mov ES:[08*4],EAx
I21_Exit:
Pop Es Ds
PopAD
Jmp DWord Ptr CS:[OffSet Int21h_Chain]
; Процедура аналог команды Int 21h
Int21h_Emu:
PushF
Db 9Ah
Int21h_Chain DD ?
Ret
; Вывод строки в верхний левый угол экрана
; Параметры: Si (в DS) - адрес AsciiZ строки
; Ah - атрибут
Out_String:
Push ES Di
Mov Di,0B800h
Mov Es,Di
Xor Di,Di
OS_Load_Symbol:
LodsB
Or AL,AL
Jz OS_Exit
StosW
Jmp OS_Load_Symbol
OS_Exit:
Pop Di Es
Ret
FAI21 DB 02
SS_101 DB "ss.drv",0
MSG_01 DB "Program title",0
MSG_02 DB "OS Detected! Hooking vectors",0
Int21h_Address DD 21h*4
Int21H_Start DD ?
Drv_Location DD ?
Segment_End:
Codes EndS
End Start
← →
Defunct © (2006-02-19 17:50) [25]вот еще пример, самомодификация boot дискетки.
компилируем в com, запускаем, в boot дискетки заносится код вывода строки на экран и при загрузки с дискетки будет выводить строку.CodeS Segment Word
Assume CS:CodeS
Org 100h
Start:
Mov Ax,0201h
Mov Cx,1h
Mov Dx,0h
Mov Bx,OffSet Buffer
Push Bx
Int 13h
Mov Ax,Word Ptr DS:[Buffer]
Mov Ax,020EBh
Mov Word Ptr DS:[Buffer],Ax
Mov Si,OffSet Loader
Mov Di,OffSet Buffer + 22h
Mov Cx,OffSet LoaderEnd - OffSet Loader
Rep MovsB
Mov Ax,0301h
Mov Cx,01h
Mov Dx,0h
Pop Bx
Int 13h
Ret
Loader:
Call Next
Next:
Mov Ax,03h
Int 10h
Mov Ax,160
Mul Dh
Add AL,DL
Adc Ah,0
Mov Di,Ax
Mov Ax,0B800h
Mov ES,Ax
Pop Si
Add Si,OffSet Str1 - OffSet Next
Push Cs
Pop Ds
Mov Ah,2Bh
L1:
LodsB
Or AL,AL
Jz Exit_OutPut
StosW
Jmp L1
Exit_OutPut:
Mov Ah,0
Int 16h
Int 19h
Ret
Str1 Db "Boot-sector is modified by defunct",0
LoaderEnd:
Buffer DB 512 Dup(?)
CodeS EndS
End Start
← →
ArtemESC © (2006-02-19 19:24) [26]>>Defunct ©
Спасибо... Я не совсем понял [22], [23]...
Вопрос остается открытым.
← →
Kerk © (2006-02-19 19:27) [27]ArtemESC © (19.02.06 19:24) [26]
0x7C00
ДОС загружает COM-программу по адресу 100h, загрузчик БИОС по 7C00h. Ну и пересчитывай смещения данных исходя из этих знаний.
← →
ArtemESC © (2006-02-19 19:27) [28]Возник глупый вопрос:
0x7C00 - это сегмент, или смещение с сегментом 0?
← →
Джо © (2006-02-19 19:35) [29]> [28] ArtemESC © (19.02.06 19:27)
> Возник глупый вопрос:
> 0x7C00 - это сегмент, или смещение с сегментом 0?
Можешь думать о нем как о 0x7C00:0x0000 :)
← →
GuAV © (2006-02-19 19:42) [30]
> 0x7C00:0x0000
Нет.
0x07C0:0x0000 или 0x0000:0x7C00 .
← →
Джо © (2006-02-19 19:44) [31]> [30] GuAV © (19.02.06 19:42)
Да, скопипастил и забыл разряд сместить, спасибо.
← →
ArtemESC © (2006-02-19 20:01) [32]GuAV © (19.02.06 19:42) [30]
не понял...
Вот последняя моя нерабочая модификация с учетом замечаний:
;for masm 6.11
title example for boot
.model small
.code
main proc
mov ax, 07C00h
mov ds, ax
mov bx, offset s
mov cx, len
xor bp, bp
J:
mov al, ds: [bx]
mov dx, 0B800h
mov es, dx
mov ah, 01Fh
mov es: [bp], ax
inc bx
add bp, 2
loop J
L: jmp L
s db "Hello world!!!"
main endp
len = ($ - s)
end main
← →
Джо © (2006-02-19 20:03) [33]> [32] ArtemESC © (19.02.06 20:01)
Послушай, в Сети ПОЛНО исходников всяческих бут-секторов, с подробнейшими комментариями. Откуда такое настойчивое желание писать что-то "вслепую", не зная ассемблера?
← →
Defunct © (2006-02-19 20:13) [34]> ArtemESC © (19.02.06 19:24) [26]
По поводу -100h вам уже пояснили. Второй же способ предполагает релокацию в другую область памяти (мне так было нужно), т.к. 07C0:0000 адрес нестабильный и загрузчик затирается кодом загружаемой ОС. Поэтому в [23] первым делом код загрузчика перемещаелся в выбранный мной сегмент и производится прыжек по новому адресу с учетом смещения на +100h, т.о. не нарушая смещений созданных транслятором.
Если вам необязательно держать загрузчик в памяти в момент загрузки ОС, тогда можно поступить проще. Сделать базовый прыжек в ту же точку на со смещенным на 10h сегментом. Например так:mov ax, cs
sub ax, 10h
push ax
push EntryPoint
retf
EntryPoint:
← →
Defunct © (2006-02-19 20:15) [35]пардон, поспешил:
Start:
mov ax, cs
sub ax, 10h
push ax
mov ax, offset EntryPoint
add ax, 100h
push ax
retf
EntryPoint:
← →
Defunct © (2006-02-19 20:16) [36]блин.. в [34] все правильно, извиняюсь за каламбур.
← →
ArtemESC © (2006-02-19 20:18) [37]>>Джо © (19.02.06 20:03) [33]
>>Сети ПОЛНО исходников всяческих бут-секторов
Честно говоря искал - все что нашел привело к еще
большим вопросам...
>>Откуда такое настойчивое желание писать что-то "вслепую", не зная >>ассемблера?
Надоело копить "теорию" -
почитал книжки, статьи, имею некоторый опыт в Windows с асм-ом
- на фига мне все ето... Хочу что-то сделать - нужна практика...etc
← →
Defunct © (2006-02-19 20:24) [38]ArtemESC © (19.02.06 20:18) [37]
ну так разобрались или нет?
← →
ArtemESC © (2006-02-19 20:40) [39]>>Defunct © (19.02.06 20:24) [38]
Да!! Спасибо всем,
вот код кому интересно:;for masm 6.11
title example for boot
.model small
.code
main proc
mov ax, 07Ch
mov ds, ax
mov bx, offset s
mov cx, len
xor bp, bp
J:
mov al, ds: [bx]
mov dx, 0B800h
mov es, dx
mov ah, 01Fh
mov es: [bp], ax
inc bx
add bp, 2
loop J
L: jmp L
s db "Hello world!!!"
main endp
len = ($ - s)
end main
← →
Defunct © (2006-02-19 20:47) [40]ArtemESC © (19.02.06 20:40) [39]
ззз bp используется не по назначению.. уже отмечал в [20]..
сделайте хотя бы так:mov ax, 07Ch
mov ds, ax
mov si, offset s
mov cx, len
mov di, 0B800h
mov es, di
xor di, di
J:
lodsb
stosw
loop J
L: jmp L
s db "Hello world!!!"
Страницы: 1 2 вся ветка
Форум: "Прочее";
Текущий архив: 2006.03.12;
Скачать: [xml.tar.bz2];
Память: 0.58 MB
Время: 0.014 c