|
|
|
| в общем я в ассемблере практически не шарю. пытаюсь написать программу, которая будет искать в строке количество символом, не совпадающих с символом, введенным с клавиатуры. проблема в том что всегда один и тот же результат, явно неадекватный.
гляньте пожалуйста код и объясните где ошибка. и еще, если можно посоветуйте нормальную документацию, по которой можно быстро выучить основы и чтобы без лишней воды.
надеюсь на этом форуме есть люди, которые в этом разбираются.
заранее спасибо
(извините за кривое название темы и за то что не туда разместил, очень спешил)
код программы:
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
|
| |
|
|
|
|
|
|
|
для: 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,"$"
|
| |
|
|
|
|
|
|
|
для: heed
(10.12.2009 в 21:14)
| |
> ;вывод
mov al,bl
mov ah,02h
add al,30h
int 21h
наверное просто al с dl перепутали
|
а здесь al нельзя использовать?
и скажите пожалуйста, ваш вариант можно в любой среде запускать? (я использую приложения C++)
извините за левые вопросы, я в этой теме полный профан :( | |
|
|
|
|
|
|
|
для: 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. | |
|
|
|
|
|
|
|
для: heed
(11.12.2009 в 02:15)
| | спасибо :)
скиньте плиз документацию :)
P.S кстати, по поводу вывода...
я же делаю inc в регистре bl, поэтому преобразовываю его в аски и пытаюсь вывести содержимое. или как здесь нужно поступать? | |
|
|
|
|
 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-и битных процессоров микросхем тоже на ассемблере кодят | |
|
|
|
|
|
|
|
для: heed
(11.12.2009 в 17:40)
| | спасибо за справочник. прикольный :)
правда нужно привыкнуть будет...
пока что ошибку у себя не нашел :( | |
|
|
|