Поиск:

Ответ в темуСоздание новой темы Создание опроса
> поиск минимального числа среди двух знаковых 
:(
    Опции темы
tatu
Дата 28.11.2010, 13:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



в общем что-то я запутался. есть условие: сравнить два знаковых числа(т.е. они могут быть положительными и отрицательными). числа должны быть в пределах -9 до 9. т.е. как я понял надо запретить ввод больших чисел. ну и сравнить их конечно.

Код

STACKS SEGMENT PARA STACK 'STACK'    
    DB 512 DUP   (?)
STACKS ENDS

DATA SEGMENT PARA 'DATA'
    
    STRING1 DB  'VVEDITE 1-oe znakovoe  chislo      $'
        STRING2 DB  'VVEDITE 2-oe znakovoe chislo      $'
        STRING3 DB  'min chislo     $'
    chislo1 dw  ?
    chislo2 dw  ?
    min dw ?
        BUF DB 20,?,20 DUP ('$')
    
DATA ENDS

CODE SEGMENT PARA PUBLIC 'CODE'
    ASSUME CS:CODE,DS:DATA,SS:STACKS

NEXT_STRING PROC NEAR ;процедура перехода на новую строку
         MOV AH,2
     MOV DL,13
     INT 21H
     MOV DL,10
     INT 21H
     RET
NEXT_STRING ENDP     

    

MAIN PROC FAR;  СНОВНАЯ ПРОГРАММА
    MOV AX,DATA
    MOV DS,AX
    MOV AH,9
    MOV DX,OFFSET STRING1    ;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        INT 21H


    ;CALL NEXT_STRING  ; Переход на новую строку

    MOV AH,0AH; 
    MOV DX,OFFSET buf;ввод 1 числа
    mov chislo1,dx
        INT 21H

    CALL NEXT_STRING  ; Переход на новую строку

        MOV AH,9
    MOV DX,OFFSET STRING2    ;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        INT 21H

        MOV AH,0AH; 
    MOV DX,OFFSET buf;ввод 2 числа
    mov chislo2,dx
        INT 21H

    CALL NEXT_STRING  ; Переход на новую строку
    
        MOV AH,9
    MOV DX,OFFSET STRING3    ;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        INT 21H
    
    mov ax,chislo2
    cmp ax,chislo1
    Jge proc_min_out
        
    MOV AH,2
    MOV DX,ax;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        INT 21H
        
        ;--------------- сделать вывод минимального числа
      

    ;------------------
   
        
    
    
    MOV AH,4CH
    INT 21H

proc_min_out:
    mov ax,chislo1    
        MOV AH,2
    MOV DX,ax;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        INT 21H
    mov ah,4ch
    int 21h

MAIN ENDP
CODE ENDS
END MAIN


вот код. но тут что-то выводит ересь. может кто подскажет что исправить и добавить?

Добавлено через 48 секунд
а, да еще. Делаем мы с Тасме.

Добавлено через 7 минут и 7 секунд
запрет, как я понял надо через прерывания делать. но вот что-то не понимаю как сделать чотбы запретить вводить числа мень -9 и больше 9.
PM MAIL   Вверх
iff
Дата 29.11.2010, 15:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Администратор
**


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

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



Вы понимаете различие между ASCII-числами и двоичными числами?


--------------------
DOS... Синей пеленой экран заполнил чистый DOS 
Мышь... Стала вдруг квадратной, потеряла форму мышь... 
Я разбил окно, девяностопятое мастдайное окно, 
И поставил DOS, и тогда увидел: Это счастье, — вот оно.  
PM MAIL WWW   Вверх
tatu
Дата 29.11.2010, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



конечно) в таблице там коды символов есть)))
PM MAIL   Вверх
tatu
Дата 30.11.2010, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



ну что никто не подскажет???

Код

STACKS SEGMENT PARA STACK 'STACK'    
    DB 512 DUP   (?)
STACKS ENDS

DATA SEGMENT PARA 'DATA'
    
    STR1 DB  'VVEDITE 1-oe znakovoe  chislo      $'
        STR2 DB  'VVEDITE 2-oe znakovoe chislo      $'
        STR3 DB  'min chislo     $'
        BUF DB 20,?,20 DUP ('$')
    buf2 db 20,?,20 dup ('$')
    
DATA ENDS

CODE SEGMENT PARA PUBLIC 'CODE'
    ASSUME CS:CODE,DS:DATA,SS:STACKS

entr PROC NEAR ;процедура перехода на новую строку
         MOV AH,2
     MOV DL,13
     INT 21H
     MOV DL,10
     INT 21H
     RET
entr ENDP



MAIN PROC FAR;  
    MOV AX,DATA
    MOV DS,AX
vvod_1:
        ;-----------------
    MOV AH,9                ;код функции (вывод строки)
    MOV DX,OFFSET STR1                   
        INT 21H
        ;-----------------

    CALL entr  ; Переход на новую строку

    MOV AH,0AH; 
    MOV DX,OFFSET BUF;  это работа с буфером, его заполняем строкой
    
        INT 21H
    call prov
    CALL entr  ; Переход на новую строку

;-----------------


MAIN ENDP
prov proc near
    MOv AX,0
        MOV AL,BYTE PTR BUF+1            ;помещение длины строки в AX
    cmp al,4
    Ja vvod_1
    cmp al,3
    ja sr_minus

sr_min2:
    cmp buf+3, 2dh
    je vvod_1
sr_vtorsim:
    cmp buf+3, 30h            ;сравниваем второй символ, т.е. если он поподает в интервал 30h до 39р то нормально
    jb vvod_1
    cmp buf+3, 39h
    ja vvod_1
sr_minus:
    cmp buf+2, 2dh                   ;сравниваем первый сивол с кодом минуса
    je sr_vtorsim
prov endp     
CODE ENDS
END MAIN
END MAIN


вот ту теще наметки идеи, но я уж сильно запутался.
PM MAIL   Вверх
500mhz
Дата 1.12.2010, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


шайтан
***


Профиль
Группа: Завсегдатай
Сообщений: 1017
Регистрация: 5.5.2008
Где: Киев / Italy

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



ТС не в теме?
и где вас учат?
Цитата

сравниваем первый сивол с кодом минуса

петросян


ps
даже влом думать по поводу


--------------------

PM MAIL ICQ   Вверх
tatu
Дата 3.12.2010, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Код

STACKS SEGMENT PARA STACK 'STACK'       
        DB 512 DUP   (?)
STACKS ENDS
 
DATA SEGMENT PARA 'DATA'
        
        STR1 DB  'VVEDITE 1-oe znakovoe  chislo      $'
        STR2 DB  'VVEDITE 2-oe znakovoe chislo      $'
        STR3 DB  'min chislo     $'
        chislo1 dw  ?
        chislo2 dw  ?
        BUF DB 20,?,20 DUP ('$')
        buf2 db 20,?,20 dup ('$')
        
DATA ENDS
 
CODE SEGMENT PARA PUBLIC 'CODE'
        ASSUME CS:CODE,DS:DATA,SS:STACKS
 
entr PROC NEAR ;процедура перехода на новую строку
         MOV AH,2
         MOV DL,13
         INT 21H
         MOV DL,10
         INT 21H
         RET
entr ENDP
 
 
 
 
 
MAIN PROC FAR;  
        MOV AX,DATA
        MOV DS,AX
vvod_1:
        ;-----------------
        MOV AH,9                                ;код функции (вывод строки)
        MOV DX,OFFSET STR1                   
        INT 21H
        ;-----------------
 
        CALL entr  ; Переход на новую строку
 
        MOV AH,0AH; 
        MOV Dx,OFFSET BUF;  это работа с буфером, его заполняем строкой
        mov chislo1,dx
        INT 21H
        MOv AX,0
        MOV Al,BYTE PTR BUF+1                   ;помещение длины строки в AX
        cmp al,1 ;сравниваем длину строки
        Ja otriz ;если больше 1, то это отрицательное число
        
polog:  cmp buf+2, 30h ;защита от дурака, т.е. если код символна меньше кода 0, то повторно вводим
        jb vvod_1
        cmp buf+2, 39h ;аналогично с кодом 9
        ja vvod_1
        mov al, byte ptr [buf+2]
        sub al, 30h
        cbw
        mov chislo1, ax
        jmp end_if                              
        
otriz:  cmp al,2 ;сравниваем длину с 2
        je otriz1 ; если равно 2 то это отрицательное и тогда проверяем
        jmp vvod_2
otriz1: cmp buf+2, 2dh ;сравниваем первый символ с кодом "-"
        jne vvod_1      
        cmp buf+3, 2dh ;защита от дурака, чтобы не вводили "--"
        je vvod_1
        mov al, byte ptr [buf+3]
        sub al, 30h
        neg al
        cbw
        mov chislo1, ax
end_if: 
        CALL entr  ; Переход на новую строку
 
;-----------------
 
vvod_2:        ;-----------------
        MOV AH,9                                ;код функции (вывод строки)
        MOV DX,OFFSET STR2 
        mov chislo1,dx                  
        INT 21H
        ;-----------------
 
        CALL entr  ; Переход на новую строку
 
        MOV AH,0AH; 
        MOV DX,OFFSET BUF;  это работа с буфером, его заполняем строкой
        
        INT 21H
;------ аналогично для второго числа проверяем.
        MOv AX,0
        MOV Al,BYTE PTR BUF+1                   ;помещение длины строки в AX
        cmp al,1 ;сравниваем длину строки
        Ja otriz11 ;если больше 1, то это отрицательное число
        
polog1:  cmp buf+2, 30h ;защита от дурака, т.е. если код символна меньше кода 0, то повторно вводим
        jb vvod_2
        cmp buf+2, 39h ;аналогично с кодом 9
        ja vvod_2
        mov al, byte ptr [buf+2]
        sub al, 30h
        cbw
        mov chislo1, ax
        jmp end_if1                              
        
otriz11:  cmp al,2 ;сравниваем длину с 2
        je otriz21 ; если равно 2 то это отрицательное и тогда проверяем
        jmp vvod_2
otriz21: cmp buf+2, 2dh ;сравниваем первый символ с кодом "-"
        jne vvod_2      
        cmp buf+3, 2dh ;защита от дурака, чтобы не вводили "--"
        je vvod_2
        mov al, byte ptr [buf+3]
        sub al, 30h
        neg al
        cbw
        mov chislo1, ax
end_if1: 
        CALL entr  ; Переход на новую строку
 
;вот тут начались проблемы. не понимаю как вывести и сравнить. почитал про вывод знаковых не понял.
        CALL entr  ; Переход на новую строку
        MOV AH,2                                                ;
        MOV Dx,chislo1                                  ;Вывод на экран num1
        ADD Dx,30h                                              ;
        INT 21h
CALL entr 
        MOV AH,9
        MOV DX,OFFSET STR3    ;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        INT 21H
        
        mov ax,chislo1
        cmp ax,chislo2
        Jg proc_min_out
        jl proc_min_out1
        
        MOV AH,2
        MOV DX,ax;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        INT 21H
proc_min_out:
        
        MOV AH,2
        mov cx,chislo2  
        MOV DX,cx;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        add dx,30h
        INT 21H
        mov ah,4ch
        int 21h
        jmp endid
proc_min_out1:
        MOV AH,2
        mov cx,chislo1  
        MOV DX,cx;ВЫВОД СТРОКИ С ПОМОЩЬЮ Ф.9
        add dx,30h
        INT 21H
        mov ah,4ch
        int 21h
        jmp endid
endid:
MAIN ENDP
CODE ENDS
END MAIN
END MAIN


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

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

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


 




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


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

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