Подскажите как увеличить рабочие биты - 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
Объяснение кода листинга программы
not ax
- здесь происходит инверсия (обращение) значения регистра AX.inc ax
- увеличивается значение регистра AX на единицу. Этот код на языке Assembler выполняет две операции: сначала инвертирует значение регистра AX, а затем увеличивает его на единицу.
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д