Подскажите как увеличить рабочие биты - Assembler

Узнай цену своей работы

Формулировка задачи:

Доброго времени суток. у меня есть задание: Матрица размером 6х8 состоит из целых чисел, каждое из которых принадлежит диапазону от -32768 до +32767. Требуется переставить столбцы матрицы в порядке убывания сумм их элементов. Если все числа в матрице равны, следует вывести на экран соответствующее сообщение. Обмен информацией с пользователем организовать в виде специальных сообщений, каждое из которых следует размещать в отдельной строке экрана. Прогу я написал(корявенько но все же), все работает, но только при определенных условиях. числа у меня записываются в 16-битные регистры (т.к. диапазон от -32768 до +32767). Если будет ситуация что промежуточная сумма чисел столбцов будет выходить из диапазона или конечная сумма, тогда данные будут не верные. К примеру столбец со значениями:32767,32767,32767,32767,327670,32767,32767,32767; сумма будет 262136. так же может быть -262136. то есть необходимо 19 бит, где их найти ума не приложу. я подобрал числа чтобы промежуточная и конечная сумма была от -32768 до +32767, поэтому и работает) но все же это надо будет сдавать, подскажите как это можно исправить. программа пишется в эмуляторе emu8086, 16 разрядные регистры(. буду очень благодарен за помощь. код ниже.
data segment  
s1 db 'vse chisla ravni',0dh,0ah,'$' 
s2 db 'ishodnii massiv:',0dh,0ah,'$'   
s3 db ,0dh,0ah,'$'  
s4 db 'sortirovanii massiv:',0dh,0ah,'$'  
s5 db 'vivod summ stolbcov(ne sortir):',0dh,0ah,'$'
s6 db 'vivod summ stolbcov sortirov:',0dh,0ah,'$' 
mas1 dw 17294,7222,311,-600,1,4829,4821,-564,-12,-7453,-6944,-11341,-23649,321,28749,281,11689,7893,781,17,-5490,-1342,3274,12,7654,-7893,2345,-7892,-564,14563,3210,30000,-12000,6780,-13248,-2340,-11698,-14280,11345,-2111,-2569,-12,23420,-27610,6782,3456,-22300,-2001
mas2 dw 6  dup(0) 
buffer equ $
ends           
 
stack segment
    dw   128  dup(0)
ends                       
code segment           
    start: 
    mov ax, data
    mov ds, ax
    mov es, ax  
   
    mov ah,09h  ;vivod stroki s2
    lea dx, s2
    int 21h    
    call vivod    ;vivod ishodnii mas1
    xor ax,ax
    xor bx,bx
    xor cx,cx
    xor dx,dx   
    xor di,di 
    mov cx,48                  ;proverka, vse chisla ravni?
a0: mov ax,mas1[di]
    mov bx,mas1[di+2]  
    cmp ax,mas1[di+2]   
    jne a1   ;perehod esli ne ravni
    inc di
    inc di
    loop a0
    mov ah,09h  ;vivod stroki s1
    lea dx, s1
    int 21h     
a1:
    xor bx,bx
    xor di,di
    xor ax,ax
    xor si,si
    mov cx,6
a2:
    push cx
    push di
    call summ ; procedura podscheta summu stolbcov, u zapis rezult v mas2
    pop di
    inc di
    inc di
    pop cx
    loop a2 
     
    mov ah,09h  ;vivod stroki s5
    lea dx, s5
    int 21h 
    call vivod_s     
     
    xor si,si
    mov cx,6
    push cx 
a6:                  ;sortirovka puzerkom
    dec cx
    cmp cx,0 
    push cx
    je z1
a3:   
    mov ax,mas2[si]   ;sravnivaem summu stolbcov
    mov bx,mas2[si+2]
    cmp ax,mas2[si+2]
    jl a4 ; esli menshe
    inc si
    inc si
    loop a3
    pop cx
    xor si,si
    jmp a6
  
a4: 
    push cx              ; men9em mestami chisla v mas1 
    mov cx,8
    mov di,si
a5: 
    mov ax,mas1[di]
    mov bx, mas1[di+2]
    mov mas1[di],bx
    mov mas1[di+2],ax
    add di,12
    loop a5
    mov ax,mas2[si]     ; ; men9em mestami chisla v mas2 
    mov bx,mas2[si+2]
    mov mas2[si],bx
    mov mas2[si+2],ax
    inc si
    inc si
    pop cx
    dec cx
    cmp cx,0
    je a7  
    jmp a3
a7:
    pop cx
    xor si,si
    jmp a6         
z1:      
 
    mov ah,09h  ;vivod stroki s6
    lea dx, s6
    int 21h     
    call vivod_s
    mov ah,09h  ;vivod stroki s4
    lea dx, s4
    int 21h 
    call vivod       ;vivod sortirovonnogo mas1
    int 20h 
 
summ proc
    mov cx,8
    xor bx,bx
p1:
    mov ax,mas1[di]
    add bx,ax
    add di,12
    loop p1
    mov mas2[si],bx
    inc si
    inc si 
    ret
summ endp 
 
proc vivod
  xor si,si
  mov cx,8
  vivod1:
  push cx
  mov cx,6
  vivod2: 
  mov ax,mas1[si]
  call print_word_sdec    
  mov         dl,' '    
  mov         ah,2h          
  int         21h 
  inc si
  inc si
  loop vivod2  
  mov ah,09h  ;vivod stroki s3
  lea dx, s3
  int 21h 
  pop cx
  loop vivod1
  ret    

vivod endp  
 
proc vivod_s
    xor si,si
    mov cx,6
sum:
    mov ax,mas2[si]
    call print_word_sdec 
    mov         dl,' '    
    mov         ah,2h          
    int         21h 
    inc si
    inc si
    loop sum  
     mov ah,09h  ;vivod stroki s3
  lea dx, s3
  int 21h 
    ret
    vivod_s endp

print_word_sdec:
    push di
    mov di,buffer       ;DI = ????? ??????
    push di         ;?????????? DI ? ?????
    call word_to_sdec_str   ;?????????????? ????? ? AX ? ??????
    mov byte[di],'$'        ;?????????? ??????? ????? ??????
    pop di          ;DI = ????? ?????? ??????
    call print_str      ;????? ?????? ?? ???????
    pop di
    ret              
    word_to_sdec_str:
    push ax
    test ax,ax          ;???????? ????? AX
    jns wtsds_no_sign       ;???? >= 0, ??????????? ??? ???????????
    mov byte[di],'-'        ;?????????? ????? ? ?????? ??????
    inc di          ;????????? DI
    neg ax          ;????????? ????? ???????? AX
wtsds_no_sign:
    call word_to_udec_str   ;?????????????? ???????????? ????????
    pop ax
    ret
    print_str:
    push ax
    mov ah,9            ;??????? DOS 09h - ????? ??????
    xchg dx,di          ;????? ?????????? DX ? DI
    int 21h         ;????????? ? ??????? DOS
    xchg dx,di          ;????? ?????????? DX ? DI
    pop ax
    ret
    word_to_udec_str:
    push ax
    push cx
    push dx
    push bx
    xor cx,cx           ;????????? CX
    mov bx,10           ;? BX ???????? (10 ??? ?????????? ???????)
 
wtuds_lp1:          ;???? ????????? ???????? ?? ???????
    xor dx,dx           ;????????? ??????? ????? ???????? ?????
    div bx          ;??????? AX=(DX:AX)/BX, ??????? ? DX
    add dl,'0'          ;?????????????? ??????? ? ??? ???????
    push dx         ;?????????? ? ?????
    inc cx          ;?????????? ???????? ????????
    test ax,ax          ;???????? AX
    jnz wtuds_lp1       ;??????? ? ?????? ?????, ???? ??????? ?? 0.
 
wtuds_lp2:          ;???? ?????????? ???????? ?? ?????
    pop dx          ;?????????????? ??????? ?? ?????
    mov [di],dl         ;?????????? ??????? ? ??????
    inc di          ;????????? ?????? ??????
    loop wtuds_lp2      ;??????? ?????
 
    pop bx
    pop dx
    pop cx
    pop ax
    ret

ends
 
end start

Решение задачи: «Подскажите как увеличить рабочие биты»

textual
Листинг программы
not ax
inc ax

Объяснение кода листинга программы

  1. not ax - здесь происходит инверсия (обращение) значения регистра AX.
  2. inc ax - увеличивается значение регистра AX на единицу. Этот код на языке Assembler выполняет две операции: сначала инвертирует значение регистра AX, а затем увеличивает его на единицу.

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

12   голосов , оценка 4.333 из 5