Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 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
3-1137647384
neat
2006-01-19 08:09
2006.03.12
Отменить сохранение редактируемой записи


3-1137594058
jack128
2006-01-18 17:20
2006.03.12
особенности работы left join


3-1137667622
ELENA_P
2006-01-19 13:47
2006.03.12
VIEW в БД и в Дельфи


8-1127912924
new___
2005-09-28 17:08
2006.03.12
Подскажите как склеить несколько wav - файлов в один?


2-1140687553
K_Lock
2006-02-23 12:39
2006.03.12
GEN_ID(num_value,1) - must have a value





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский