Пользователь
Регистрация: 08.12.2008
Сообщений: 22
|
Вывод двумерного массива(asm)
Наверное тупой вопрос, но сломал себе голову, не могу понять почему не хочет выводить (((. Суть задачи такова, нужно ввести с клавиатуры "двумерный массив", найти минимальный элемент в массиве, ну и попутно вывести этот введенный массив в виде матрицы, т.е, к примеру, массив 2 на 2 должен выглядеть.
(1, 2)
(3, 4)
Ввод происходит корректно, поиск минимального элемента тоже, но вот вывод работает не правильно (. В столбце смещается вправо не на 1 элемент, а на 2 (
Код:
;----------------Input procedure
Input proc
push BX
push CX
push DX
xor AX, AX
xor BX, BX
xor CX, CX
xor DX, DX
mov AH, 1h
int 21h
cmp AL, 2Dh ; = 40 = '-'
jne isFrom0To9
mov CL, 2Dh
CharInput:
mov AH, 1h
int 21h
isFrom0To9:
cmp AL, 0Dh ; is it equal to CR** = 13?
je endOfInput
cmp AL, 39h ; is it greater than '9' = 57?
jg charInput
cmp AL, 30h ; is it less than '0' = 48?
jl charInput
mark:
sub AL, 30h ; = '0'
mov BL, AL
mov AX, DX
mov DX, 10
mul DX
add AX, BX
mov DX, AX
jmp charInput
endOfInput:
mov AX, DX
call newLine
cmp CL, 2Dh
jne mark2
neg AX
mark2:
pop DX
pop CX
pop BX
RET
Input endp
;---------------End of input procedure
;---------------Output procedure
Output proc
push BX
push CX
push DX
push AX
xor DX, DX
xor CX, CX
mov BX, 10
test AX, 1000000000000000b
jz numberOfDigits
mov AH, 2h
mov DL, 2Dh
int 21h
pop AX
push AX
neg AX
numberOfDigits:
xor DX, DX
div BX
push DX
inc CL
cmp AX, 0
jne numberOfDigits
successiveOutput:
pop DX
add DL, 30h
mov AH, 2h
int 21h
loop successiveOutput
pop AX
pop DX
pop CX
pop BX
RET
Output endp
;---------------End of output procedure
.model small
.stack 100h
.data
n dw ?
m dw ?
array dw 100 dup(0)
intputMes db "Set array: $"
inputNMes db "Set n: $"
inputMMes db "Set m: $"
outputMinMes db "Min:$"
.code
;=====================================================
Initialize proc
lea Dx, inputNMes
mov Ah, 9h
int 21h
call NewLine
call Input
mov n, Ax
call NewLine
lea Dx, inputMMes
mov Ah, 9h
int 21h
call NewLine
call Input
mov m, Ax
call NewLine
xor Dx, Dx
xor Bx, Bx
mov si, 0
mov Cx, n
rowsInit:
push Cx
mov Cx, m
mov si, 0
columnsInit:
call Input
mov array[bx][si], Ax
add si, 2
loop columnsInit
nextInit:
add bx, 2
inc dx
cmp dx, n
jb rowsInit
call NewLine
jmp program
RET
initialize endp
;=====================================================
main:
jmp start
include io.asm
start:
mov AX,@DATA
mov DS,AX
xor Ax, Ax
xor Bx, Bx
xor Cx, Cx
xor Dx, Dx
mov si, 0
mov bx, 0
call Initialize
program:
xor Ax, Ax
xor Bx, Bx
xor Cx, Cx
xor Dx, Dx
mov si, 0
mov Ax, array[bx][si]
rows:
push Cx
mov Cx, m
mov si, 0
columns:
add si, 1
mov Dx, array[bx][si]
cmp Ax, Dx
ja less
loop columns
jmp next
less:
mov Ax, Dx
loop columns
next:
add bx, 2
inc di
cmp di, n
jb rows
exit:
lea Dx, outputMinMes
mov Bx, Ax
mov Ah, 9h
int 21h
mov Dx, Bx
mov Ah, 02h
add Dl, 30h
int 21h
xor si, si
xor bx, bx
xor Ax, Ax
mov Cx, Cx
rowsOut:
push Cx
mov Cx, m
mov si, 0
call NewLine
columnsOut:
mov Ax, array[bx][si]
call Output
mov Dl, 20h
mov Ah, 02h
int 21h
add si, 2
loop columnsOut
nextOut:
pop Cx
add bx, 2
inc Cx
cmp Cx, n
jb rowsOut
mov AH,4ch
int 21h
end main
компилятор TASM
|