Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Центр помощи > [Tasm] Максимум в числе!


Автор: svyashennik 30.4.2007, 20:15
Задание: Найти максимальную цифру в числе и сохранить её.

Вот что я набросал а дальше не знаю?! 
Код

; Сегменты не более 64 килобайт
.MODEL    SMALL

; Сегмент стека
Sseg    SEGMENT    STACK    'stack'
    DB    256    DUP    (?)
Sseg    ENDS

; Сегмент данных
Dseg    SEGMENT    'data'
    X     DW    123d
    RES DW    ?
Dseg    ENDS

; Сегмент кода
Cseg    SEGMENT    'code'
ASSUME    CS:Cseg, DS:Dseg, SS:Sseg

; Головная подпрограмма
Main    PROC FAR
    ; Подготовимся к возврату в операционную систему
    PUSH    DS
    MOV     AX, 0
    PUSH    AX
    ; Настроим DS на наш сегмент данных
    MOV     AX, Dseg
    MOV     DS, AX
    MOV     AX,X       ;AX=X
    MOV     BL,10      ;Делить будем на 10 
Continue:                  ;Метка продолжения 
    IDIV    BL          
    CMP     AL,0         
    JE      Exit       ;Если AL=0, то на выход 
     ...

Exit:                      ;Метка выхода 
    MOV     RES,?      ;Сохраним результаты
    ; Передача управления первому оператору в PSP
    RET
Main    ENDP
Cseg    ENDS
    END    Main

Если можно с коментариями?! Заранее огромное спасибо!


Автор: anwe 30.4.2007, 21:09
Зачем добавлять себе сложностей?
В ДОСе есть функция 0А, которая заносит в буфер строку с клавиатуры. Код цифр от 30 до 39. Просто берешь из буфера каждый байт с сравниваешь.

Автор: svyashennik 30.4.2007, 21:14
Я всё понимаю! Но мне именно таким способом нужно! Но за идею спасибо! Хотя я в этом то не сильно силён!

Автор: anwe 30.4.2007, 21:38
Как это 
Цитата(svyashennik @  30.4.2007,  21:14 Найти цитируемый пост)
именно таким способом нужно


А если так, то в чем вопрос?

Автор: svyashennik 30.4.2007, 21:39
Я просто не знаю как сделать по твоему способу! Я имею ввиду так как сделал я но там нужно продолжить я не знаю как?!

Автор: anwe 30.4.2007, 21:43
Цитата(svyashennik @  30.4.2007,  21:39 Найти цитируемый пост)
как сделать по твоему способу

Я же написал.
Возьми описание 0А, посмотри что ей передается, структуру буфера. Ничего сложного. smile 

Автор: svyashennik 1.5.2007, 00:08
Что то не могу найти ничего про это описание ОА с чем его "едят"?

Автор: anwe 1.5.2007, 00:17
ah=0Ah
ds:dx=адрес буфера
int 21h

Автор: JAPH 1.5.2007, 08:32
anwe, неполное описание.
http://www.selfteachers.ru/index.php?name=Teacher&path=selfteachers/programming/tasks%20and%20examples%20assembler/glava%205/index3.htm

По-моему, лучше 3Fh:
Код

mov ah, 3Fh
xor bx, bx ;Ввод с клавиатуры
mov cx, 0050h ;Сколько максимум символов можно съесть
lea dx, buffer ;DS:DX - простой буфер. Enter есть 0Dh 0Ah
int 21h

Ввод продолжается до заполнения буфера или до нажатия Enter.
На выходе в DS:DX строка, в AX - её длина.

Автор: svyashennik 1.5.2007, 08:45
Спасибо за такую активную помощь! 

Вот как я сделал:
Код

; Сегменты не более 64 килобайт
.MODEL    SMALL

; Сегмент стека
Sseg    SEGMENT    STACK    'stack'
    DB    256    DUP    (?)
Sseg    ENDS

; Сегмент данных
Dseg    SEGMENT    'data'
    X     DW    123d
    RES DW    ?
Dseg    ENDS

; Сегмент кода
Cseg    SEGMENT    'code'
ASSUME    CS:Cseg, DS:Dseg, SS:Sseg

; Головная подпрограмма
Main    PROC FAR
    ; Подготовимся к возврату в операционную систему
    PUSH    DS
    MOV     AX, 0
    PUSH    AX
    ; Настроим DS на наш сегмент данных
    MOV     AX, Dseg
    MOV     DS, AX
    MOV     AX,X       ;AX=X
    MOV     BL,10      ;Делить будем на 10 
Continue:                  ;Метка продолжения 
    IDIV    BL          
    CMP     AL,0         
    JE      Exit       ;Если AL=0, то на выход 
    mov ah, 3Fh
    xor bx, bx ;Ввод с клавиатуры 
    mov cx, 0050h ;Сколько максимум символов можно съесть
    lea dx, buffer ;DS:DX - простой буфер. Enter есть 0Dh 0Ah
    int 21h 
Exit:                      ;Метка выхода 
    MOV     RES,AX      ;Сохраним результаты
    ; Передача управления первому оператору в PSP
    RET
Main    ENDP
Cseg    ENDS
    END    Main


Но выводится ошибка в 37-ой строке! Якобы не знает что такое BUFFER!
И хотелось бы узнать, нельзя это сделать через условные и безусловные переходы? 

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