Замученный студент
|
||||||
1 | ||||||
Требуется помощь26.10.2008, 20:17. Показов 3095. Ответов 3
Метки нет (Все метки)
Здравствуйте.
Уважаемые программисты, не могли бы вы объяснить новичку принцып работы ниже приведенной программы, буду очень признателен, если к каждой строке дадите коментарий. Заранее благодарен. ПРОГРАММА:
|
26.10.2008, 20:17 | |
Ответы с готовыми решениями:
3
Требуется помощь требуется помощь Требуется помощь Требуется помощь!!! |
2 / 2 / 0
Регистрация: 18.08.2008
Сообщений: 35
|
|
27.10.2008, 21:26 | 2 |
Да всю прогу объяснять этож забодаться можно...
Спрашивайте конкретно что не понятно...
0
|
Замученный студент
|
|
07.12.2008, 22:37 | 3 |
*************************
org 100h tabl_ascii db '0123456789abcdef' org 130h org 41h db 0ah,0bh... x_ascii db 20h dup(?) t1 db 0dh,0ah,"Введите число и нажмите Enter" g_k proc @data d: lea dx, t1 lea di, x_ascii call ink call bin_dis push ax pop ax call outhex cmp al,"y" xor stosb dis endp r1: mov dl,[di] lea di,buf outhex: prnbh: prnd: prnc: ??? ************************* Буду очень признателен, если поможете. Если возможно - то прямо построчно, чтобы примерно мог понять принцип. Заранее спасибо. |
2 / 2 / 0
Регистрация: 18.08.2008
Сообщений: 35
|
|
08.12.2008, 00:46 | 4 |
*************************
org 100h ;Смещение начала кода 100h для всех *.COM приложений tabl_ascii db '0123456789abcdef' ;Строка с символами org 130h ;Какае-то х-ня org 41h ;Какае-то х-ня db 0ah,0bh... ;2 байта, точки вообще не понятно тачем x_ascii db 20h dup(?) ;выделяется буффер 20 байт значение не определено t1 db 0dh,0ah,"Введите число и нажмите Enter";Строка с символами g_k proc ;Объявление процедуры g_k @data ;Это не понятно что d: ;Метка для перехода lea dx, t1 ;адрес t1 поместить в dx, иногда можно ;mov dx,offset t1 lea di, x_ascii ;адрес x_ascii поместить в di call ink ;Вызов процедуры ink call bin_dis ;Вызов процедуры bin_dis push ax ;поместить в стек ax pop ax ;извлечь из стека ax call outhex ;Вызов процедуры bin_dis cmp al,"y" ;сравнить содержимое al c символом "y" ;здеси должна быть команда для условного перехода xor ;Логическое исключающее ИЛИ stosb ;записывает байт по адресу ES:[EDI] dis endp ;Конец процедуры dis r1: ;Метка для перехода mov dl,[di] ;записать в dl байт по адресу в di lea di,buf ;сохранить в di адрес buf outhex: ;Метка для перехода prnbh: ;Метка для перехода prnd: ;Метка для перехода prnc: ;Метка для перехода ??? ;Вопросы, их надо закомментировать вот так... ;??? ************************* Ну и работенка... Добавлено через 4 минуты 31 секунду Вот код моей программы полностью рабостоспособной... Ну может есть какие баги по мелочи Прога называется PCI Master Предназначена для работы с шиной PCI, в часности для редактирования регистров чипсета Код
.586p SkyCode segment para public 'CODE' use16 assume cs:SkyCode, es:SkyCode, ss:SkyCode, ds:SkyCode, fs:nothing, gs:nothing ;######################################## ;Обьявляем сегмент кода... ;######################################## ;Процедура DriverEntry public _start _start proc pusha pushf push es push ds mov ax,100h mov ss,ax mov ax,cs mov es,ax mov ds,ax xor bx,bx mov ah,0 mov al,3 int 10h mov si,offset Logo_1 mov di,36 mov ah,0Bh call SP_SetString mov si,offset Logo_2 mov di,196 mov ah,0Bh call SP_SetString mov si,offset Logo_3 mov di,356 mov ah,0Bh call SP_SetString mov si,offset Init_OK mov di,480 mov ah,0Eh call SP_SetString mov si,offset Get_data mov di,692 mov ah,0Ah call SP_SetString @GetKey: mov si,offset Working mov di,1120 mov ah,0Eh call SP_SetString xor bx,bx mov ah,2 mov dx,041Eh int 10h mov di,700 xor cx,cx mov esi,offset DevBuffer @GetKey_1: mov ah,10h int 16h cmp ah,1Ch jz @Exit_Key_1 cmp ah,0Eh jz @GetKey xor ah,ah xchg si,di stosw dec di dec di xchg si,di mov ah,0Ah call SP_SetString dec si inc cx cmp cx,2 jz @Exit_Key_1 jmp @GetKey_1 @Exit_Key_1: mov edi,offset PCIS.PciBus mov esi,offset DevBuffer mov ecx,2 call TextToHex xor bx,bx mov ah,2 mov dx,0425h int 10h mov di,714 xor cx,cx mov esi,offset DevBuffer add esi,2 @GetKey_2: mov ah,10h int 16h cmp ah,1Ch jz @Exit_Key_2 cmp ah,0Eh jnz @NotBS_2 cmp cx,0 jz @GetKey jmp @Exit_Key_1 @NotBS_2: xor ah,ah xchg si,di stosw dec di dec di xchg si,di mov ah,0Ah call SP_SetString dec si inc cx cmp cx,2 jz @Exit_Key_2 jmp @GetKey_2 @Exit_Key_2: mov edi,offset PCIS.PciDev mov esi,offset DevBuffer add esi,2 mov ecx,2 call TextToHex xor bx,bx mov ah,2 mov dx,042Ch int 10h mov di,728 xor cx,cx mov esi,offset DevBuffer add esi,4 @GetKey_3: mov ah,10h int 16h cmp ah,1Ch jz @Exit_Key_3 cmp ah,0Eh jnz @NotBS_3 cmp cx,0 jz @Exit_Key_1 jmp @Exit_Key_2 @NotBS_3: xor ah,ah xchg si,di stosw dec di dec di xchg si,di mov ah,0Ah call SP_SetString dec si inc cx cmp cx,0 @Exit_Key_3: xor eax,eax mov edi,offset PCIS.PciFun mov esi,offset DevBuffer add esi,4 mov ecx,1 call TextToHex xor bx,bx mov ah,2 mov dx,0432h int 10h mov di,740 xor cx,cx mov esi,offset DevBuffer add esi,5 @GetKey_4: mov ah,10h int 16h cmp ah,1Ch jz @Exit_Key_4 cmp ah,0Eh jnz @NotBS_4 cmp cx,0 jz @Exit_Key_2 jmp @Exit_Key_3 @NotBS_4: xor ah,ah xchg si,di stosw dec di dec di xchg si,di mov ah,0Ah call SP_SetString dec si inc cx cmp cx,2 jz @Exit_Key_4 jmp @GetKey_4 @Exit_Key_4: mov edi,offset PCIS.PciReg mov esi,offset DevBuffer add esi,5 mov ecx,2 call TextToHex @Wait_OK: mov ah,10h int 16h cmp ah,1Ch jnz @Wait_OK @ReadData: xor ebx,ebx xor eax,eax mov al,PCIS.PciBus and eax,11111111b shl eax,16 or ebx,eax xor eax,eax mov al,PCIS.PciDev and eax,11111b shl eax,11 or ebx,eax xor eax,eax mov al,PCIS.PciFun and eax,111b shl eax,8 or ebx,eax xor eax,eax mov al,PCIS.PciReg and eax,11111100b or ebx,eax or ebx,80000000h mov eax,ebx ;Запретить прерывания cli ;Запишем данные mov dx,0CF8h out dx,eax ;Подождем пока все устаканится mov ecx,1000 @WaitLoop: xor edx,edx loop @WaitLoop ;Понеслась sti mov Device,eax mov dx,0CFCh in eax,dx mov ebx,eax mov edi,offset buffer mov ecx,31 @DeCodeDword: mov eax,ebx shr eax,cl and eax,1b cmp al,0 jz @Zeero mov al,31h stosb dec ecx cmp ecx,0FFFFFFFFh jnz @DeCodeDword jmp @DeCodeDword_OK @Zeero: mov al,30h stosb dec ecx cmp ecx,0FFFFFFFFh jnz @DeCodeDword @DeCodeDword_OK: xor eax,eax stosd mov si,offset buffer mov di,960 mov ah,0Ah call SP_SetString mov si,offset ReadData mov di,800 mov ah,0Bh call SP_SetString mov edi,1022 mov edx,061Fh mov esi,offset buffer add esi,31 @SetCursorW: xor bx,bx mov dh,6 mov ah,2 int 10h @GetData: mov ah,10h int 16h cmp ah,1Ch jz @DataWrite cmp ah,0Eh jz @Left cmp ah,39h jz @Right xor ecx,ecx cmp al,30h jz @Test_0_1_OK cmp al,31h jnz @GetData @Test_0_1_OK: xchg esi,edi xor ah,ah stosb xchg esi,edi dec esi mov ah,0Ch ; mov bx,ax xor cx,cx mov ax, 0B800h mov es, ax mov ax,bx lodsb stosw mov ax,cs mov es,ax ; dec esi sub edi,2 cmp dl,0 jz @SetCursorW dec dl dec esi sub edi,2 jmp @SetCursorW @GetData_1: dec dh inc dl jmp @SetCursorW @Left: cmp dl,0 jz @GetData dec edx dec edi dec edi dec esi jmp @SetCursorW @Right: cmp dl,31 jz @GetData inc edx inc edi inc edi inc esi jmp @SetCursorW @DataWrite: xor ebx,ebx stosd xor eax,eax mov esi,offset buffer mov ecx,31 @NextByteW: lodsb cmp al,30h jz @ZeeroW xor eax,eax or eax,1 @ZeeroW: and eax,1 shl eax,cl or ebx,eax dec ecx cmp cx,0FFFFh jnz @NextByteW mov eax,Device mov dx,0CF8h out dx,eax mov eax,ebx mov dx,0CFCh out dx,eax mov si,offset WriteData mov di,800 mov ah,0Bh call SP_SetString mov si,offset PressExit mov di,1120 mov ah,0Eh call SP_SetString mov ah,10h int 16h cmp al,"m" jz @WriteSector cmp al,"M" jz @WriteSector cmp ah,01h jnz @Exit_Key_3 pop ds pop es popf popa int 19h mov ax,4C00h int 21h @WriteSector: mov esi,0F0000h mov edi,offset buffer mov ecx,200h xor eax,eax mov ds,ax rep movsb mov ax,cs mov ds,ax mov ah,03h mov al,1 ; число секторов для чтения xor ch,ch ; и 2 старших бита CL - номер цилиндра mov cl,1 ; номер начального сектора mov dh,0 ;номер головки mov dl,0 ;номер устройства mov bx,offset buffer int 13h jmp @Exit_Key_3 _start endp SP_SetString proc pushf push cx push bx mov bx,ax xor cx,cx mov ax, 0B800h mov es, ax mov ax,bx @ReadText: lodsb test al,al jz @ExitSetString stosw jmp @ReadText @ExitSetString: mov ax,cs mov es,ax pop bx push bx xor dx,dx mov ax,di dec ax mov cx,2 div cx cmp ax,39 jg @BigStr mov dx,ax xor dh,dh jmp @SetCursor @BigStr: xor dx,dx mov cx,80 div cx mov dh,al @SetCursor: inc dl mov ax,0200h int 10h pop bx pop cx popf xor al,al ret SP_SetString endp TextToHex proc pusha pushf xor ebx,ebx mov edx,2 @StatSP_TextToHex: lodsb shl ebx,4 cmp al,41h jl @SP_TextToHex_9 and eax,1111b add al,9 jmp @SaveResult @SP_TextToHex_9: and eax,1111b @SaveResult: or bl,al dec edx test edx,edx jnz @NotSaveByte mov al,bl stosb mov edx,2 @NotSaveByte: loop @StatSP_TextToHex cmp edx,2 jz @EndSP_TextToHex mov al,bl stosb @EndSP_TextToHex: popf popa ret TextToHex endp Device dd 0 Logo_1 db "*************** PCI Master ***************",0 Logo_2 db " *****SkyProc Computer Systems****",0 Logo_3 db " ***********2008**********",0 Init_OK db "Init OK...",0 Get_data db "BUS-00,DEV-00,FUN-0,REG-00",0 WriteData db "Write Data OK... ",0 ReadData db "Read Data OK... ",0 Working db "Working... ",0 PressExit db "Press Esc to Exit",0 PCIX struct PciBus db 0 PciDev db 0 PciFun db 0 Pcireg db 0 PCIX ends DevBuffer db 256 dup (0) buffer db 200h dup (0) PCIS PCIX <0,0,0,0> ;Конец сегмента кода SkyCode ends end _start Зачем спросите вы это надо, ну постараюсь обьяснить... По умолчанию мой чип KT600 настроен так что NB/SB V-Link (шина соединяет северный мост с южным) поддерживает только 8-Bit шину В Everest можно посмотреть пропускную способность вашей NB/SB V-Link... Я сделал следующее... Я поменял в Device 0 Offset 48 - это сам северный мост,устройство 0, регистр 48, пятый бит 0->1 Опять запустил Everest и пропускная способность NB/SB V-Link увеличилась в два раза кажется... Код
Вот так выглядит кусочек datasheet на KT400 Device 0 Offset 48 – NB/SB V-Link Configuration (18h)RW 7 V-Link Parity Check 0 Disable................................................... default 1 Enable 6 Rest Bus Width Support 0 Not Supported ....................................... default 1 Supported 5 16-bit Bus Width Support 0 Disable................................................... default 1 Enable 4 8-Bit Bus Width Support 0 Disabel 1 Enable................................................... default 3 4x Rate Support 0 Disabel 1 Enable................................................... default 2 2x Rate Support 0 Disable................................................... default 1 Enable 1 Reserved ........................................always reads 0 0 8x Rate Support 0 Disable................................................... default 1 Enable А вы можете в ручную настраивать тайминги DDR и много чего другого. Читайте datasheet на свои чипсеты. Теперь как собрать приложение... Код
1. Устанавливаете MASM 6.11 2. Создаете текстовый документ и копируете туда следующее @echo off echo. \MASM611\bin\ml /c prog.asm \MASM611\binr\link prog.obj pause echo. @echo off 3. Переименовываете файл в exe.bat 4. Копируете текст программы в файл prog.asm 5. Помещаете exe.bat и prog.asm в одну папу на том же диске где и MASM 6.11 6. Запускаете exe.bat, пару нажатий Enter и программа готова... Как работать с программой... 1. Закидываете её на дискету 2. Ставите в привод загрузочный диск с TotalCommander и перезагружаетесь 3. Из TotalCommander запускаете прогу 4. Вводите значения: BUS-00,DEV-00,FUN-0,REG-00 Для выше описанного случая: BUS-00,DEV-00,FUN-0,REG-48 (для разных чипсетов рызличное назначение регисров!!!) Адреса регистров воодить только кратные 4, т.е. 04, 08, 0С, 10, 14 и т.д. т.к. программа выводит четыре регистра одновременно. byte4 | byte3 | byte2 | byte1 | 00000000000000000000000000000000 <-Первый бит... 5.Меняем только те биты которые надо (space перемещает курсор в право, backspace в лево) 6. Жмем Enter - регистры изменены. 7. Жмем еще Enter для перехода к выбору регистра или Esc для выхода. Прога под DOS. Удачи...
0
|
08.12.2008, 00:46 | |
08.12.2008, 00:46 | |
Помогаю со студенческими работами здесь
4
Требуется помощь! Help!!! Требуется помощь Требуется помощь. Требуется помощь Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |