Перестановка в массиве - Assembler
Формулировка задачи:
поставить сначала положительные элементы в обратной последовательности, по сравнению с исходной в массиве, а затем остальные в той же последовательности.
пример
исходный
-2, 2, -3, 3, -4, 4
преобразованный
4, 3, 2, -2, -3, -4
Помогите начать
хотя бы блок схему
Не могу понять алгоритм, помогите хотя бы только с алгоритмом
-2, 2, -3, 3, -4, 4
2
, -2, -3, 3, -4, 4 2,3
, -2, -3, -4, 4 2, 3,4
, -2, -3, -4 эТО КАК СПОСОБ ТОКА КАк его организовать не могу представитьРешение задачи: «Перестановка в массиве»
textual
Листинг программы
; ; \MASM\BIN\Ml /c /Cp /nologo /Fl /Sa /Sn SepRevSb.ASM ; \MASM\BIN\Link /TINY /MAP /NOLOGO SepRevSb,,; ; .8086 .MODEL TINY ; CR EQU 0Dh LF EQU 0Ah ; KbHeadLen EQU 2 ChBufLen EQU 80 KbBufLen EQU ChBufLen + KbHeadLen ; .DATA sdAppInfo DB "Separates Positions of Positive and Negative Numbers", CR, LF DB "with Reversing Positions of Positive Numbers" DB CR, LF, "$" sdEnter DB " enter string of separated by spaces signed numbers (range: -99...99)", CR, LF DB " enter empty string to exit" sdCrLf DB CR, LF, "$" sdWrongChar DB " wrong char.", CR, LF, "$" sdNoDigit DB " no digit", CR, LF, "$" sdOverflow DB " overflow", CR, LF, "$" sdPointer DB "^", CR, LF, "$" ; kbBuf DB ChBufLen, ? chBuf EQU kbBuf + KbHeadLen ; dbSrcArr EQU kbBuf + KbBufLen ; .CODE ORG 100h START: LEA DX, sdAppInfo CALL showSd STR_LOOP: LEA DX, sdEnter LEA SI, kbBuf CALL inputStr JCXZ EXIT LEA DI, dbSrcArr CALL sd2Array JNC VER_EMPTY_STR MOV CX, AX SUB CX, Offset chBuf CALL showPointer CALL showSd JMP STR_LOOP VER_EMPTY_STR: JZ EXIT MOV BX, AX ; Save length of array CALL initRegs ; Separate positive numbers ADD SI, CX POS_LOOP: DEC SI MOV AL, [SI] TEST AL, AL JS NEXT_POS STOSB NEXT_POS: LOOP POS_LOOP ; Separate negative numbers MOV DX, DI CALL initRegs MOV DI, DX NEG_LOOP: LODSB TEST AL, AL JNS NEXT_NEG STOSB NEXT_NEG: LOOP NEG_LOOP ; Show Result Array CALL initRegs MOV SI, DI CALL showArray JMP STR_LOOP EXIT: RET ; sd2Array: ; Input: SI = String$ Address ; DI = Array Buffer ; Output: if no error: NCF ; AX = Array Length in bytes; ZF if empty ; if error: CF ; AX = Address of error in string ; DX = Message of error PUSH CX PUSH DI XOR CH, CH ; Number counter s2askipblank: LODSB CMP AL, CR JE s2aok CMP AL, " " JE s2askipblank INC CH DEC SI MOV BX, SI XOR CL, CL ; Length of number s2asearchnumterm: LODSB CMP AL, CR JE s2anumfound CMP AL, " " JE s2anumfound INC CL JMP s2asearchnumterm s2anumfound: DEC SI CALL str2SignByte99 JC s2aexit STOSB JMP s2askipblank s2aok: XOR AX, AX MOV AL, CH TEST AX, AX s2aexit: POP DI POP CX RET ; str2SignByte99: ; Input: BX = Address of String ; CL = Length of String ; Output: if no error NCF ; AL = Byte ; if error CF ; AX = Address of error in string ; DX = Message of error ; Used: BX PUSH CX CMP [BX], Byte Ptr "-" PUSHF JNE s2sb9conv INC BX DEC CL s2sb9conv: CALL str2Byte99 JNC s2sb9sign POP CX JMP s2sb9exit s2sb9sign: POPF JNE s2sb9exit NEG AL CLC s2sb9exit: POP CX RET ; str2Byte99: ; Input: BX = Address of String ; CL = Length of String ; Output: if no error NCF ; AL = Byte ; if error CF ; AX = Address of error in string ; DX = Message of error ; Used: BX, DX PUSH CX XOR CH, CH JCXZ s2bnodig ADD BX, CX CALL char2Dig JC s2berror MOV DL, AL DEC CX JCXZ s2bok CALL char2Dig JC s2berror MOV AH, 10 MUL AH ADD DL, AL s2bskip0: DEC CX JZ s2bok CALL char2Dig JC s2berror TEST AL, AL JZ s2bskip0 s2boverflow: LEA DX, sdOverflow JMP s2berror s2bnodig: LEA DX, sdNoDigit s2berror: MOV AX, BX STC JMP s2bexit s2bok: MOV AL, DL s2bexit: POP CX RET ; char2Dig: ; Used: BX, AL DEC BX MOV AL, [BX] SUB AL, "0" JC c2dwrongchar CMP AL, 10 CMC JNC c2dexit c2dwrongchar: LEA DX, sdWrongChar c2dexit: RET ; inputStr: ; Input: SI = Keyboard Buffer Address ; Output: CX = Number of Chars ; SI = String Address CALL showSd MOV DX, SI INC SI MOV AH, 0Ah INT 21h CALL crLf XOR CH, CH MOV CL, [SI] ; String length INC SI RET ; initRegs: LEA SI, dbSrcArr MOV DI, SI MOV CX, BX ADD DI, CX RET ; showArray: ; Input: SI = Array Address ; CX = Array Length PUSH CX PUSH SI sharrloop: LODSB CALL showSignByte99 MOV DL, " " CALL showChar LOOP sharrloop CALL crLf POP SI POP CX RET ; showSignByte99: ; Shows Sign. Byte in range -99...99 ; Input: AL = Byte PUSH DX TEST AL, AL JNS doaam NEG AL MOV DL, "-" CALL showChar doaam: AAM TEST AH, AH JZ showlowdigit MOV DL, AH CALL showDigit showlowdigit: MOV DL, AL CALL showDigit POP DX RET ; showDigit: ADD DL, "0" showChar: ; Input: DL = Char PUSH AX MOV AH, 2 INT 21h POP AX RET ; showPointer: ; Input: CX = Offset of Pointer PUSH DX MOV DL, " " JCXZ setptr sploop: CALL showChar LOOP sploop setptr: LEA DX, sdPointer CALL showSd POP DX RET ; crLf: LEA DX, sdCrLf showSd: ; Input: DX = String Address MOV AH, 9 INT 21h RET ; END START ;