Перестановка в массиве - 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
;

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

5   голосов , оценка 3.4 из 5
Похожие ответы