Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.06.2009, 21:31   #1
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию Сортировка матрицы

нужно ввести матрицу и отсортировать ее елементы, вывести результат

проблема в том , что когда вводить двузначные числа, то возникает переполнение при делении. Помогите разобраться

Код:
; vivod matricy
Output PROC

     xor si,si
     mov cx,16
     mov bx,1

out_elem:
    
     ;jcxz label_2         ; esli cx=0
     cmp cx,0
     je label_2
     push bx

     xor ax,ax  
     mov al,offset mas[si]
     xor dx,dx
     mov bx,ax

m1:
     xor bx,bx
     mov bl,10
     div  bl                   ; result v al, ostatok v ah
     mov bh,al 
     add ah,30h           ; chislo v simvol
     xchg al,ah
     xor ah,ah             
     push ax                ; simvol v stek
     inc dx
     mov al,bh             ; resultata uzhe v bh
     cmp al,0              
     ja m1

m2:
     pop ax                 ; simvol iz steka
     xchg ax,dx          ; v al schetchik, v dl simvol
     
     push ax
     mov ah,02h
     int 21h
     pop ax
     dec ax
     cmp al,0
     ja m2

     mov dx,20h   ; probel
     mov ah,02h
     int 21h
     
     pop bx

     cmp bx,4       ; posle 4 elementa perevod stroki
     je perevod
     jmp cykl
  
perevod:

     mov dx,offset caret
     mov ah,09h
     int 21h
     mov bx,0
    
cykl:
     
     
     inc bx
     add si,2
 
     loop out_elem
 

label_2:
 
     ret

ENDP
counter вне форума Ответить с цитированием
Старый 07.06.2009, 23:06   #2
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

А ты буфер вводимых данных какой объявил?
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 08.06.2009, 00:35   #3
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

разобрался
counter вне форума Ответить с цитированием
Старый 08.06.2009, 11:59   #4
MalCer
Форумчанин
 
Аватар для MalCer
 
Регистрация: 15.07.2008
Сообщений: 615
По умолчанию

Ну и в чем проблема? Кинь весь исходник, пожалуйста! Хочется посмотреть
xor eax, eax
xchg [eax], eax
MalCer вне форума Ответить с цитированием
Старый 09.06.2009, 00:00   #5
counter
Участник клуба
 
Регистрация: 18.10.2008
Сообщений: 1,409
По умолчанию

Код:
.model small

.stack 100h

.data 

str1    db  'Element     $'
str2    db  'Vvedite matricu:$'
str3    db  'Ishodnaya matrica:$'
str4    db  'Resultat$'
error   db  'Neverniy symvol !$'
caret  db  0Ah,0Dh,'$'
mas   dw  16 dup (0)

.code
    
; vvod matricy
Input PROC   

   mov ah,09h
   mov dx,offset str2
   int 21h

   mov dx,offset caret
   int 21h
   int 21h
   
   xor di,di           ; obnulyaem indeks
   mov cx,10h     ; kol-vo elem matricy 16 
   mov bx,0         ; flag polozhitelnogo

in_elem:
    
   xor dx,dx
   mov ah,09h
   mov dx,offset str1
   int 21h
   mov bx,0

l1:
   
   mov ah,01h   ; vvod simvola al=kod simvola
   int 21h  
     
   cmp al,0Dh           ; esli enter
   je next
   
   cmp al,30h
   jb err_label           ;esli < 0
   cmp al,39h
   ja err_label           ; esli > 9

   xor ah,ah  
   sub ax,30h            ; otnyat' kod '0'
   push ax
   mov  ax, bx
   mov  bx,0Ah         ; umnozhit' na 10 
   mul  bx
   mov  bx, ax
   pop  ax
   add  bx, ax
   jmp l1

next:
   
   mov mas[di],bx
   add di,2               ; dobavit' 2 bayta (dw)

   mov dx,offset caret
   mov ah,09h
   int 21h

   loop in_elem

   jmp label_1

err_label:

   mov ah,09h
   mov dx,offset caret
   int 21h
   mov dx,offset error
   int 21h
   mov dx,offset caret
   int 21h
   jmp  in_elem

label_1:
   
    ret

ENDP

; vivod matricy
Output PROC

     xor si,si
     mov cx,10h
     mov bx,1

out_elem:
    
     jcxz label_2         ; esli cx=0
     push bx                ; sohranit' nomer elementa

     xor ax,ax  
     xor dx,dx
     mov ax,offset mas[si]
   
m1:
     xor bx,bx
     mov bl,0Ah
     div  bl                   ; result v al, ostatok v ah
     mov bl,ah 
     add bx,30h           ; chislo v simvol
     push bx                ; simvol v stek
     inc dx
     xor ah,ah
     cmp ax,0              
     je m2
     jmp m1
    
m2:
     pop ax                 ; simvol iz steka
     xchg ax,dx          ; v ax schetchik, v dx simvol
     push ax
     mov ah,02h
     int 21h
     pop dx
     dec dx                 ; проблема была в том, что в этом куске портился регистр ax
     cmp dx,0              ; поэтому и возникало переполнение 
     je m4
     jmp m2
      
m4:      
     mov dx,20h   ; probel
     mov ah,02h
     int 21h     
     pop bx
     cmp bx,4       ; posle 4 elementa perevod stroki
     je perevod
     jmp m3
  
perevod:
     mov dx,offset caret
     mov ah,09h
     int 21h
     mov bx,0
    
m3:     
     inc bx
     add si,2
 
     loop out_elem
 

label_2:
 
     ret

ENDP  
  
; sortirovka
Sort       PROC   
      
     xor si,si
     mov di,2

loop1:
 
      mov ax,mas[si]
      mov dx,mas[di]
      cmp ax,dx            
      ja change
    
      cmp di,16*2    ; esli posledniy element
      je loop3
      
loop2:

      add di,2
      jmp loop1

loop3:
 
      cmp si,14*2         ; esli predposledniy element
      je exit

      add si,2 
      mov di,si
      add di,2
      jmp loop1

change:
 
      xchg ax,dx
      mov mas[si],ax
      mov mas[di],dx
      jmp loop2
        
exit:

      ret

ENDP

; NACHALO
start :

     mov ax,@data
     mov ds,ax
     mov es,ax

     call Input
     
; ochistka ekrana

     mov ax,0600h     ; ah=06 - prokrutka, 
                                 ; al=00 - ves' ekran
     mov bh,07           ; normal atribut (black-white)
     mov cx,0             ; verch - levo
     mov dx,184Fh     ; niz - pravo
     int 10h                 ; BIOS
   
; ustanovka kursora
  
     mov ah,02h         ; func BIOS
     mov bh,0             ; ekran 0
     mov dx,0             ; dh - stroka , dl - stolbec
     int 10h

     mov ah,09h
     mov dx,offset str3
     int 21h  
     mov dx,offset caret
     int 21h
     int 21h
       
     call Output

     call Sort

     mov ah,09h
     mov dx,offset caret
     int 21h 
     mov dx,offset str4
     int 21h  
     mov dx,offset caret
     int 21h
     int 21h
          
     call Output

     mov ax,4C00h
     int 21h

end start

Последний раз редактировалось counter; 09.06.2009 в 00:07.
counter вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сортировка матрицы Dartchuwak Помощь студентам 4 06.04.2010 15:49
Матрицы. Сортировка Ominous48 Паскаль, Turbo Pascal, PascalABC.NET 5 18.05.2009 11:51
c++ сортировка матрицы Aion Помощь студентам 10 15.05.2009 14:30
сортировка строк матрицы aurora_87 Общие вопросы C/C++ 3 23.04.2009 12:29