Поиск:

Ответ в темуСоздание новой темы Создание опроса
> TASM. Ошибки в программе. 
:(
    Опции темы
alReg
Дата 30.12.2010, 20:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.12.2010

Репутация: нет
Всего: нет



Написал первую прогу на TASM (переводил исходники с УУМ). Компилируется, линкуется нормально, но отрабатывает с ошибкой. Помогите разобраться, пожалуйста. Что я сделал не так? (
Код

;   Ввести строку символов и определить, сколько в ней содержится двузначных чисел.
;

    .MODEL small
    .STACK 256   ; Выделяем 256 байт памяти
    .DATA
Soob    db 'Program start',10,13,'$'
Stroka    db 'ffga 21 ab 74 1 845 2 p 98',10,13,'$'
count    Dw 0
dlina    Dw 0
k    Dw 0
EOL    db 10,13,'$'

    .CODE
Begin:
    mov ax, @DATA ;zapisivaem adres segmenta
    mov ds, ax
    mov es, ax

    ; Print:
    mov ah, 09h
    mov SI, OFFSET Soob ;загрузка адреса сообщения
    int    21h    
    xor ax, ax
    mov SI, OFFSET [Stroka + 2]    ; Адрес первого символа строки
    mov ax, 0
    mov word ptr[dlina], ax  ; dlina, k, count = 0:    
    mov word ptr[k], ax
    mov word ptr[count] , ax
    xor ax, ax ;Устанавливает в AL 0100 0100 (способ очистки реестра)
    xor cx, cx
m1:
    LODS  BYTE PTR [SI]    ;Загружаем в AL очередной символ из Str
    cmp AL, 30h ;сравниваем. 30h - код 0 в ASCII
    je m2
    cmp AL, 31h 
    je m2
    cmp AL, 32h 
    je m2
    cmp AL, 33h 
    je m2
    cmp AL, 34h 
    je m2
    cmp AL, 35h 
    je m2
    cmp AL, 36h 
    je m2
    cmp AL, 37h 
    je m2
    cmp AL, 38h 
    je m2
    cmp AL, 39h 
    je m2
    xor ax, ax
    mov ax, word ptr[k]
    cmp ax, 2
    je m4      ;если к=2 переход
m3:
    xor ax, ax
    mov ax, 0
    mov word ptr[k], ax
    mov ax, word ptr[dlina]
    add ax, 1 
    mov word ptr[dlina], ax
    cmp ax, 26
    je Fin
    jmp m1

m2:
    xor ax, ax
    mov ax, word ptr[k]
    add ax, 1 ;прибавить 1
    mov word ptr[k], ax

    mov ax, word ptr[dlina]
    add ax, 1 
    mov word ptr[dlina], ax

    cmp ax, 26
    je Fin
    jmp m1

m4:
    xor ax, ax
    mov ax, word ptr[count]
    add ax, 1 
    mov word ptr[count], ax
    mov ax, word ptr[dlina]
    cmp ax, 26
    je Fin2
    jmp m3
Fin:
    xor ax, ax
    mov ax, word ptr[k]
    cmp ax, 2
    je m4
Fin2:
    xor ax, ax
    mov ah, 09h
    mov dx, OFFSET EOL
    int    21h

    mov ah, 09h
    mov dx, OFFSET count
    int 21h
    END Begin
    




PM MAIL   Вверх
JAPH
Дата 30.12.2010, 23:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 312
Регистрация: 8.1.2007
Где: Ленобласть

Репутация: 5
Всего: 23



Цитата(alReg @ 30.12.2010,  20:24)
Код

    .MODEL small
    .STACK 256
    .DATA
Soob    db 'Program start',10,13,'$'
Stroka    db 'ffga 21 ab 74 1 845 2 p 98',10,13,'$'
count    Dw 0
dlina    Dw 0
k    Dw 0
EOL    db 10,13,'$'

    .CODE
Begin:
    mov ax, @DATA
    mov ds, ax
    mov es, ax

    ; Print:
    mov ah, 09h
    mov SI, OFFSET Soob ;; Куда? DX же нужен вроде
    int    21h    
    xor ax, ax
    mov SI, OFFSET [Stroka]    ; Адрес первого символа строки. Почему +2 ?
;    mov ax, 0 -- зачем, если уже был xor ax, ax?
;    mov word ptr[dlina], ax  ; dlina, k, count = 0: -- зачем, если там и так ноль из-за директив dw?
;    mov word ptr[k], ax
;    mov word ptr[count] , ax
    xor ax, ax ;Устанавливает в AL 0100 0100 (способ очистки реестра) --что такое 0100 0100?? рЕЕстра?))))
;    xor cx, cx ; и где он используется?
m1:
    LODS  BYTE PTR [SI]
;; привет индусам. Почему не
;   cmp al, '0'
;   jb  m0
;   cmp al, '9'
;   jbe m2
;m0:
    cmp AL, 30h
    je m2
    cmp AL, 31h 
    je m2
    cmp AL, 32h 
    je m2
    cmp AL, 33h 
    je m2
    cmp AL, 34h 
    je m2
    cmp AL, 35h 
    je m2
    cmp AL, 36h 
    je m2
    cmp AL, 37h 
    je m2
    cmp AL, 38h 
    je m2
    cmp AL, 39h 
    je m2
;    xor ax, ax -- зачем, если сразу ноль перетирается числом из [k] ?
    mov ax, word ptr[k]
    cmp ax, 2
; есть команда cmp word ptr [k], 2
    je m4      ;если к=2 переход
m3:
    xor ax, ax
;    mov ax, 0
    mov word ptr[k], ax
;; можно и mov word ptr [k], 0
    mov ax, word ptr[dlina]
    add ax, 1 
    mov word ptr[dlina], ax
    cmp ax, 26
    je Fin
    jmp m1

m2:
    xor ax, ax
    mov ax, word ptr[k]
    add ax, 1 ;прибавить 1
    mov word ptr[k], ax
; можно inc word ptr [k]
    mov ax, word ptr[dlina]
    add ax, 1 
    mov word ptr[dlina], ax

    cmp ax, 26
    je Fin
    jmp m1

m4:
    xor ax, ax
    mov ax, word ptr[count]
    add ax, 1 
    mov word ptr[count], ax
    mov ax, word ptr[dlina]
    cmp ax, 26
    je Fin2
    jmp m3
Fin:
    xor ax, ax
    mov ax, word ptr[k]
    cmp ax, 2
    je m4
Fin2:
    xor ax, ax
    mov ah, 09h
    mov dx, OFFSET EOL
    int    21h

    mov ah, 09h
    mov dx, OFFSET count ;; оппа, а тут что - число типа word, или строка, оканчивающаяся на '$'? Необходимо перевести число в строку перед выводом
    int 21h

; А выходить корректно?
mov ax, 4C00h
int 21h
    END Begin
    

А так алгоритм правильный вроде =)


--------------------
Что непонятно - спрашиваем smile
PM MAIL ICQ   Вверх
alReg
Дата 5.1.2011, 23:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 30.12.2010

Репутация: нет
Всего: нет



JAPH, Спасибо большое.   smile 
Исправил - всё нормально заработало smile

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Asm для начинающих"
MAKCim
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой КОД.
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, MAKCim.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Asm для начинающих | Следующая тема »


 




[ Время генерации скрипта: 0.0488 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.