Форум программистов
 
Контакты: о проблемах с регистрацией, почтой и по другим вопросам пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail.

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail


Ответ
 
Опции темы
Старый 11.02.2012, 01:28   #1
Dimasik73
 
Регистрация: 11.02.2012
Сообщений: 5
По умолчанию что происходит в этом коде

Код:
DOSSEG
model small
stack 100h
.386
dataseg 
     
    mess_1 db 0dh,0ah,0ah,'Byte of POST diagnostic(0Eh):' ;Байт диагностики
     db 0dh,0ah,'Proper installation RTC: $' ;Правильна установка
    mess_2 db 0dh,0ah,'Invalid boot disk: $' ;Невірний загрузочний жорсткий диск 
    mess_3 db 0dh,0ah,'The correct size RAM: $' ;Правильний розмір ОП
    mess_4 db 0dh,0ah,'Configuration is correct: $' ;Конфигурация правильная
    mess_5 db 0dh,0ah,'CMOS checksum is correct: $' ;Контрольна сума CMOS правильна
    mess_6 db 0dh,0ah,'CMOS battery is working: $' ;Батарея CMOS справна
     
 msg dd mess_1,mess_2,mess_3,mess_4,mess_5,mess_6
  
    exit_ db 0ah,0dh,"Press escape to exit...",0ah,0dh,'$'
   
    i db 0
     
 yn dw yn_0,yn_1
    yn_0 db 'Yes$' ;1
    yn_1 db 'No$'  ;0
   
codeseg
  start:
  mov ax,@data
  mov ds,ax  
;-------------- 
  mov al,0eh
  out 70h,al
  jmp $+2
  xor ax,ax
   
  in al,71h
  jmp $+2
   
  ;0eh статус діагностики
  call Get_POST_byte
   
  ;press escape to exit
 escape:
  mov ah,09h
  mov dx,offset exit_
  int 21h
   
  mov ah,10h  
  int 16h
   
  cmp al,01bh ;1b - scan code of escape
  je exit
  jmp escape
;-------------- 
 exit:
  mov ah,4ch
  int 21h
   
  ;0eh статус діагностики
  Get_POST_byte proc
   
  mov cx,06h
  mov di,0h
  shr ax,2
  m:
    push ax
 mov bx,di
 mov ax,4h
 mul bx
 xchg ax,bx
    mov edx, msg[bx];
    mov ah,09h
    int 21h
 pop ax
    shr ax,1
 push ax
    rcl si,1 
    call print_yes_no
 pop ax
    inc di 
  loop m 
     
 ret
  Get_POST_byte endp
  
  print_yes_no proc
    mov ah,09h
 shr si,1
 jc $+6
    lea dx,yn[4]
    jmp int21h_
 lea dx,yn[8]     
    
   int21h_:
 int 21h
  
 ret
  print_yes_no endp
  
  end start
я не шарю кому не сложно распишите что здесь происходит))

Последний раз редактировалось Stilet; 11.02.2012 в 09:05.
Dimasik73 вне форума Ответить с цитированием
Старый 11.02.2012, 08:57   #2
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Код:
mov al,0eh
out 70h,al
jmp $+2
xor ax,ax

in al,71h
jmp $+2
получаем POST сообщение из BIOS - статус основных элементов ПК

Код:
Get_POST_byte proc

mov cx,06h ;Инициализируем цикл - нужно считать состояние 6 бит
mov di,0h   ; чистим di - смещение в массиве указателей строк для вывода 
shr ax,2   ; избавляемся от двух нижних бит регистра, которые пустые    
m:
push ax ; сохраняем ax
mov bx,di ;
mov ax,4h
mul bx 
xchg ax,bx получаем смещение текущего указателя на строку в массиве
mov edx, msg[bx]; а тут собственно сам адрес строки загружаем
mov ah,09h
int 21h ; вывод сообщения по данному биту
pop ax восстанавливаем ax
shr ax,1; сносим нижний бит 
push ax сохраняем регистр для будущего цикла
rcl si,1 ; заносим снесённый бит в si
call print_yes_no; функция вывода "да" или "нет"
pop ax ; восстанавливаем регистр
inc di ; переходим к следующему элементу массива
loop m ; обратно по циклу

ret
Get_POST_byte endp
здесь поверяем соответствующие биты на значение (ошибка или нет) и выводим сответствующее сообщение на экран.
Код:
print_yes_no proc
mov ah,09h
shr si,1 ; сносим наш многострадальный текущий бит в CF
jc $+6 ; и если там 1, то переходим на три строки ниже
lea dx,yn[4] ; загружаем ответ "Да"
jmp int21h_ ; переходим к выводу ответа
lea dx,yn[8] ; загружаем ответ "Нет"

int21h_:
int 21h ; выводим статус

ret
print_yes_no endp
Ну а здесь и реализован выбор, выводить "да" или "нет" по значению бита...

Как по мне - сделано немножко кривовато, но вроде должно работать)
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 11.02.2012 в 09:50.
DiemonStar вне форума Ответить с цитированием
Старый 11.02.2012, 11:23   #3
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Я бы сделал примерно так:
Код:
Get_POST_byte proc

mov cx,06h ;Инициализируем цикл - нужно считать состояние 6 бит
mov bh,al ; Освобождаем ax
mov bl, 00000100b ; вводим тестовое значение
lea di, msg ; получаем ссылку на массив
m:
mov ah, 09h
mov edx, dword ptr [di]
int 21h ; выводим текущее сообщение

mov ah,09h
test bh, bl ; проверяем нужный бит на значение
jnz error
  lea dx, yn_0 ; если 0 - тогда нет ошибки
jmp vivod
error:
  lea dx, yn_1 ; если 1 - есть ошибка
vivod:
int 21h ;выводим нужное сообщение
shl bl,1 ; сдвигаем тестовое значение на следующий бит
add di, 4 ; выбираем следующий элемент массива указателей на сообщение
loop m ; обратно по циклу
ret
Get_POST_byte endp
и короче, и понятнее...
Правильно поставленная задача - три четверти решения.

Последний раз редактировалось DiemonStar; 11.02.2012 в 11:30.
DiemonStar вне форума Ответить с цитированием
Старый 11.02.2012, 11:50   #4
Dimasik73
 
Регистрация: 11.02.2012
Сообщений: 5
По умолчанию

Вот спасибо! Выручил прям! а прога работает)
Dimasik73 вне форума Ответить с цитированием
Старый 19.02.2012, 20:43   #5
Dimasik73
 
Регистрация: 11.02.2012
Сообщений: 5
По умолчанию а за что отвечает именно этот блок программы? что такое db 0dh,0ah,0ah db 0dh,0ah

mess_1 db 0dh,0ah,0ah,'Byte of POST diagnostic(0Eh):' ;Байт диагностики
db 0dh,0ah,'Proper installation RTC: $' ;Правильна установка
mess_2 db 0dh,0ah,'Invalid boot disk: $' ;Невірний загрузочний жорсткий диск
mess_3 db 0dh,0ah,'The correct size RAM: $' ;Правильний розмір ОП
mess_4 db 0dh,0ah,'Configuration is correct: $' ;Конфигурация правильная
mess_5 db 0dh,0ah,'CMOS checksum is correct: $' ;Контрольна сума CMOS правильна
mess_6 db 0dh,0ah,'CMOS battery is working: $' ;Батарея CMOS справна

msg dd mess_1,mess_2,mess_3,mess_4,mess_5, mess_6

exit_ db 0ah,0dh,"Press escape to exit...",0ah,0dh,'$'
Dimasik73 вне форума Ответить с цитированием
Старый 19.02.2012, 23:54   #6
DiemonStar
Старожил
 
Регистрация: 08.02.2012
Сообщений: 2,173
По умолчанию

Выделяется память под сообщения пользователям
Правильно поставленная задача - три четверти решения.
DiemonStar вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Где ошибка в этом коде??? moshkin_ura PHP 5 23.01.2012 21:31
что означает последняя часть в этом коде? Rondo Помощь студентам 1 30.01.2011 22:50
что означают ... в этом коде? Rondo Помощь студентам 1 28.01.2011 12:45
что такое answ в этом коде! Rondo Помощь студентам 1 17.01.2011 12:26
Можно ли в этом С++-коде избавиться от C-шного преобразования типов? Oleg_SK Общие вопросы C/C++ 8 07.06.2010 15:32