Форум программистов, компьютерный форум, киберфорум
Assembler: DOS/Real Mode/16-bits
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.93/15: Рейтинг темы: голосов - 15, средняя оценка - 4.93
Замученный студент
1

Требуется помощь

26.10.2008, 20:17. Показов 3095. Ответов 3
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Здравствуйте.
Уважаемые программисты, не могли бы вы объяснить новичку принцып работы ниже приведенной программы, буду очень признателен, если к каждой строке дадите коментарий.
Заранее благодарен.

ПРОГРАММА:

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
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
.MODEL small
.STACK 64
.DATA
;Сегмент данных
;____________________________________________________________________
;Таблица преобразования “цифра – ASCII-код”
        org                             100h
        tabl_ascii  db       '0123456789abcdef'
;____________________________________________________________________
;Таблица преобразования “ASCII-код - цифра”
        org                  130h
        db                   0,1,2,3,4,5,6,7,8,9
        org                  41h
        db                   0ah,0bh, 0ch, 0dh, 0eh, 0fh
;____________________________________________________________________
;Резервация и инициализация переменных в памяти
        org                             150h
        x_ascii     db       20h dup(?)
        t1             db         0dh,0ah,"Введите число и нажмите Enter"
                        db        0dh, 0ah, "$"
        t2             db         0dh,0ah,"Вы ввели число”,0dh,0ah "$"
        t3             db         0dh, 0ah, "В двоичной системе оно
выглядет так"
                        db        0dh,0ah,"$"
        t4             db         0dh, 0ah, "В шестнадцатеричной так"
                        db        0dh, 0ah, "$"
      buf db 16 dup(?),"$"
        t5             db         0dh,0ah, "Будем продолжать процесс?
(Y/N)?"
                        db        0dh,0ah,"$"
;____________________________________________________________________
 
;Сегмент кодов
.CODE
;Главная процедура 
  g_k proc
        mov                       ax,@data
        mov                       ds, ax
        mov                  es, ax
  d:   lea                        dx, t1
        mov                       ah,09h
        int                       21h
        lea                       di, x_ascii
        call                      ink
        call                      des_2
        push                      ax
        lea                       dx,t3
        mov                       ah,9h
        int                       21h
        pop                       ax
        call                      bin_dis
        push                      ax
        lea                       dx,t4
        mov                       ah,9h
        int                       21h
        pop                  ax
        call                      outhex
        lea                       dx,t5
        mov                       ah,9h
        int                       21h
        mov                       ah,1h
        int                       21h
        cmp                       al,"Y"
        loope                 d
        cmp                  al,"y"
        loop                 d
        mov                  ah,4ch
        int                  21h
  g_k endp
  ink proc
 
;Процедура ввода десятичного числа 
        xor                  cx,cx
  l1:
        mov                  ah,1
        int                       21h
        stosb
        inc                  cx
        cmp                  al,0dh
        jnz                       l1
        dec                  cx
        ret
  ink endp
  dis proc
 
 ;Процедура вывода на экран десятичного числа 
  r1: mov                    dl,[di]
        mov                  ah,2
        int                  21h
        inc                  di
        loop                 r1
        ret
  dis endp
  des_2 proc
 
;Перевод числа(десятичного) в двоичную систему
        mov            si,10
        lea            di,x_ascii
        sub            ax,ax
  v1: mul              si
        mov            bp,ax
        mov            al,[di]
        sub            al,48
        inc            di
        mov            ah,ch
        add            ax,bp
        loop           v1
        ret
  des_2 endp
  bin_dis proc
 
  ;Процедура вывода на экран двоичного числа
        lea            di,buf
        mov            cx,16
        mov            bx,ax
        mov            dx,ax
conv:
        mov            al,ch
        shl            dx,1
        adc            al,'0'
        stosb
        loop           conv
        mov            ah,9h
        lea            dx,buf
        int                  21h
        mov      ax,bx
        ret
  bin_dis endp
 
;Процедура перевода числа(двоичного)в шестнадцатеричную
;и вывод его на экран
outhex:
      mov              ch,al
      mov              al,ah
      mov              ah,2
      call             prnbh
      mov              al,ch
prnbh:
      mov        dh,al
      shr              al,1
      shr              al,1
      shr              al,1
      shr              al,1
      call             prnd
      mov              al,dh
      and              al,15
prnd:
      or               al,48
      cmp              al,58
      jc               prnc
      add              al,7
prnc:
      mov         dl,al
      int              33
      ret
 
  end g_k
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
26.10.2008, 20:17
Ответы с готовыми решениями:

Требуется помощь
Здравстуйте, гуру оптимизации и раскрутки! Обращаюсь к вам за помощью и советом, т.к. мало что...

требуется помощь
всем привет, в наличии имеется шикарная вещь под названием "светодиодная видео труба", кахдая труба...

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

Требуется помощь!!!
.........Друзья Мои!!! Помогите пожалуйста(ссылочку если есть) скачать драйвер(очень древний) :...

3
2 / 2 / 0
Регистрация: 18.08.2008
Сообщений: 35
27.10.2008, 21:26 2
Да всю прогу объяснять этож забодаться можно...
Спрашивайте конкретно что не понятно...
0
Замученный студент
07.12.2008, 22:37 3
Цитата Сообщение от SkyProc Посмотреть сообщение
Да всю прогу объяснять этож забодаться можно...
Спрашивайте конкретно что не понятно...
*************************
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
Добавлено через 3 минуты 15 секунд
Зачем спросите вы это надо, ну постараюсь обьяснить...
По умолчанию мой чип 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
В общем BIOS позволяет менять только мизерное количество настроек чипсетов...
А вы можете в ручную настраивать тайминги 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.12.2008, 00:46
Помогаю со студенческими работами здесь

Требуется помощь! Help!!!
Здравствуйте уважаемые гуру и не только. Не думал, что придется спрашивать совета, всегда все...

Требуется помощь
Добрые люди, подскажите пожалуйста стоимость вывода в ТОП сайта по запросам: мрамор, гранит,...

Требуется помощь.
Не могу понять. сайт весь мною проверен. - Отправляю на перепроверку пишет: Что сделать?

Требуется помощь
Добрый день всем. Не знаю пишу-ли в нужном месте,или нет,но я сейчас пытаюсь настроить доску...


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

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