Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > TASM. Ошибки в программе.


Автор: alReg 30.12.2010, 20:24
Написал первую прогу на 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
    




Автор: JAPH 30.12.2010, 23:13
Цитата(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
    

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)