Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
Самоучитель PHP 5 / 6 (3 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. MySQL на примерах. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP 5. На примерах. Авторы: Кузнецов М.В., Симдянов И.В., Голышев С.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Разное

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Assembler, не моуг найти ошибку в программе
 
 автор: psychomc   (10.12.2009 в 14:07)   письмо автору
 
 

в общем я в ассемблере практически не шарю. пытаюсь написать программу, которая будет искать в строке количество символом, не совпадающих с символом, введенным с клавиатуры. проблема в том что всегда один и тот же результат, явно неадекватный.
гляньте пожалуйста код и объясните где ошибка. и еще, если можно посоветуйте нормальную документацию, по которой можно быстро выучить основы и чтобы без лишней воды.
надеюсь на этом форуме есть люди, которые в этом разбираются.
заранее спасибо
(извините за кривое название темы и за то что не туда разместил, очень спешил)
код программы:

name prog
.model small
.data
    ;строка в которой ищем
    string   db 'abcdaefjha'
    
.code
main proc far
assume ds:@data,es:@data ;привязка ds и es к сегменту данных
start:
    mov ax,@data
    mov ds,ax
    mov es,ax
    xor bx,bx; чистим
    
    ;ввод
    mov ah,01h
    int 21h    
    ;символ в al
    
    mov cx,10; цикл
    cld ; идем вперед
    
    lea di,string ;адрес в di
    jmp poisk ;пропускаем счетчик

found:
    inc bl ;считаем

poisk:
    repe scas string 
    jne found
    ; в bl ответ
exit:
    ;вывод
    mov al,bl
    mov ah,02h
    add al,30h
    int 21h    
    mov ax,4C00h;
    int 21h     
main endp
end start

  Ответить  
 
 автор: heed   (10.12.2009 в 21:14)   письмо автору
 
   для: psychomc   (10.12.2009 в 14:07)
 

> ;вывод
mov al,bl
mov ah,02h
add al,30h
int 21h
наверное просто al с dl перепутали

у меня что-то только с edx получилось на Fasm
cmp byte [ edx ] , al
отказалось работать если cmp byte [ dx ] , al

org 100h
        ;вывод
        mov     ah, 9
        mov     edx, string
        int     21h
     ;ввод
    mov ah,07h
    int 21h ;символ в al

     mov cx, 100
     xor bl,bl ; 0

_while:
      cmp  byte [ edx ] , al
      jne _continue
      inc bl;    ;++
      _continue:
      inc edx;    ;++
      cmp byte [ edx ], "$"
loopne _while

        ;вывод
    xchg dl,bl
    add dl,30h
    mov ah,02h
    int 21h

mov ax,4C00h  ;quit
int 21h
string db "helloworld",13,10,"$"  

  Ответить  
 
 автор: psychomc   (10.12.2009 в 22:27)   письмо автору
 
   для: heed   (10.12.2009 в 21:14)
 

> ;вывод
mov al,bl
mov ah,02h
add al,30h
int 21h
наверное просто al с dl перепутали


а здесь al нельзя использовать?
и скажите пожалуйста, ваш вариант можно в любой среде запускать? (я использую приложения C++)

извините за левые вопросы, я в этой теме полный профан :(

  Ответить  
 
 автор: heed   (11.12.2009 в 02:15)   письмо автору
 
   для: psychomc   (10.12.2009 в 22:27)
 


         DOS Fn 02H: Вывод на дисплей 

 DL    ║ символ, выводимый на стандартный вывод

Описание:    Посылает символ из DL на стандартный вывод.

             Обрабатывает символ Backspace (ASCII 8), перемещая курсор влево
             на одну позицию и оставляя его в новой позиции.

             При обнаружении Ctrl-Break выполняется INT 23H.


я в этой теме тоже так-же не ушёл дальше вcяких lea mov и xchg :)
, по памяти могу только ещё inc add sub и cmp вспомнить

>приложения C++

С++ это расширение С, а С надстройка над ассемблером (если так можно сказать ,)
А приложения я совсем слабо представляю почему так называются :))

Если имеете ввиду программы с GUI (графическим пользовательским интерфейсом)
, то например в виндовс обычно юзают API (апликейшн программинг интерфейс)
, и программы выполняются в так-называемом User-Ring , а оттуда нельзя так просто напрямую вызвать прерывания , например INT 21H.
Тот код который Вы привели выполняется на совсем другом уровне, это не PE-файл
, это так называемое програмирование под DOS,под 16-и битную ОС, к BIOS тоже какие-то из прерываний относятся
Даже cmd.exe в виндовс это 32-х битное PE.

  Ответить  
 
 автор: psychomc   (11.12.2009 в 10:16)   письмо автору
 
   для: heed   (11.12.2009 в 02:15)
 

спасибо :)

скиньте плиз документацию :)


P.S кстати, по поводу вывода...
я же делаю inc в регистре bl, поэтому преобразовываю его в аски и пытаюсь вывести содержимое. или как здесь нужно поступать?

  Ответить  
 
 автор: heed   (11.12.2009 в 17:40)   письмо автору
143 Кб
 
   для: psychomc   (11.12.2009 в 10:16)
 

у меня нет такой документации ,) вообще не сильно пытался вникнуть в DOS-программинг
, нашёл как-то такой exe-файл
, с файлом данных сгенерированным программой HELPGEN. Copyright (c) С.М.Абель 1988 г.
Попытался чего-нибудь найти в другом формате, но там целые горы файлов только по дос

> inc в регистре bl, поэтому преобразовываю его в аски

здесь не понял что это может значить
, inc увеличивает записанное там значение на 1
BL это младший байт регистра BX
BH , это старший байт из BX
регистры общего назначения AX, BX, CX и DX , можно использовать как угодно, если это логично.)
Но это всё в 16-битных программах, в 32-х битной виндовс указатели 32х битные
и приходится в основном работать с EAX, EBX, ECX и EDX
чуть раньше можно было записать 32x -битное значение только например в такой ES:DX регистр

//upd
вообщето программы пишут и не только для компьютеров с x86 и x64 процессорами
? для 8-и битных процессоров микросхем тоже на ассемблере кодят

  Ответить  
 
 автор: psychomc   (11.12.2009 в 17:59)   письмо автору
 
   для: heed   (11.12.2009 в 17:40)
 

спасибо за справочник. прикольный :)
правда нужно привыкнуть будет...

пока что ошибку у себя не нашел :(

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования