Переставить во всех словах буквы в обратном порядке - Assembler

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

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

Переставить во всех словах буквы в обратном порядке

Помогите организовать вывод тож через прерывания
data segment
req db  10,13,'Enter string:$'
inpbuf  db  30      
len db  ?       
buf label   byte      
ends
 
stack segment
    dw   128  dup(0)
ends
 
code segment
start:
; set segment registers:
    mov ax, data
    mov ds, ax
    mov es, ax
    
    mov  ah, 09h
    lea  dx, req
    int  21h
 
    mov ah, 0Ah
    lea dx, inpbuf      
    int 21h     
 
    mov cl,len
    xor ch,ch
    lea si,buf
    XOR BX,BX
    XOR DI,DI
@4:    
    MOV BP,SI
@1:
    INC BX
    LODSB
    CMP AL, 20h
    LOOPNE @1
    cmp cx,0
    JE @@1
    SUB BX,1
    PUSH CX
@@1:
    ADD DI,BX
    PUSH DI
    MOV DX,SI
    SHR BX,1 
    MOV CX,BX
    MOV SI,BP
    XOR BX,BX 
@2: 
    dec di
    lodsb
    mov BL,buf[di] 
    mov buf[di], al
    mov [si-1],BL
    loop    @2    
    MOV SI,DX
    CMP [SI], 0Dh
    JE @@3
        POP DI 
    POP CX 
    ADD DI,1
 
    XOR BX,BX
    JMP @4
 
    mov ax, 4c00h ; exit to operating system.
    int 21h    
ends
 
end start
-----Пример-----

Исходная строка:

asdf sd

Результат:

fdsa ds Если где то я намудрил что весьма вероятно пишите напишу коментарии к фрагменту кода

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

textual
Листинг программы
;
.8086
.MODEL TINY
;
CR    EQU   0Dh
LF    EQU   0Ah
;
MaxKBufLen  EQU   80                ; Max.length within CR terminator
VectNum     EQU   5
;
.CODE
      ORG   100h
START:
      JMP   EXEC
apProc LABEL Word
      DW    Offset showSd
      DW    Offset inputSc
      DW    Offset reverWords
      DW    Offset getWord
      DW    Offset reverWord
sdAppInfo   DB    "Program reverses words in string", CR, LF
            DB    "Wickedly crafted in emu8086 (for example ;o)", CR, LF, "$"
sdEnter     DB    " enter string of words (empty string - exit)"
sdCrLf      DB    CR, LF, "$"
EXEC:
      MOV   CX, VectNum
      LEA   DI, afpVold
      LEA   SI, apProc
      MOV   AL, 61h
SV_LOOP:
      MOV   AH, 35h
      INT   21h
      MOV   [DI], BX
      MOV   [DI+2], ES
      ADD   DI, 4
      MOV   DX, [SI]
      ADD   SI, 2
      MOV   AH, 25h
      INT   21h
      INC   AL
      LOOP  SV_LOOP
;
      PUSH  CS
      POP   ES
      LEA   DX, sdAppInfo
      INT   97
STR_LOOP:
      LEA   DX, sdEnter
      INT   97
      LEA   SI, kbBuf
      MOV   CL, MaxKBufLen
      INT   98
      JCXZ  EXIT        ; No chars
      LEA   DX, sdCrLf
      INT   97
      INT   99
      JCXZ  EXIT        ; Empty string
; Show Result
      MOV   DX, SI
      INT   97
      JMP   STR_LOOP
EXIT:
      MOV   CX, VectNum
      LEA   SI, afpVold
      MOV   AX, 2561h
RV_LOOP:
      PUSH  DS
      MOV   DX, [SI]
      MOV   DS, [SI+2]
      ADD   SI, 4
      INT   21h
      INC   AL
      POP   DS
      LOOP  RV_LOOP
      RET
;
reverWords:
; Input:  SI = stringCR address
; Output: CX = number of words
      PUSH  DX
      PUSH  SI
      XOR   DX, DX            ; Word counter
rwsloop:
      INT   100
      JCXZ  rwsexit
      INT   101
      INC   DX
      JMP   rwsloop
rwsexit:
      MOV   CX, DX
      POP   SI
      POP   DX
      IRET
;
getWord:
; Input:  SI = stringCR address
; Output: BX = word address
;         CX = word length
;         SI = current position in stringCR
      PUSH  AX
      XOR   CX, CX      ; Word length
gwskipspace:
      LODSB
      CMP   AL, CR
      JE    gwexit
      CMP   AL, "0"
      JL    gwskipspace
      CMP   AL, "9"
      JLE   gwitsword
      CMP   AL, "A"
      JL    gwskipspace
gwitsword:
      DEC   SI
      MOV   BX, SI
gwsearchwordterm:
      LODSB
      CMP   AL, CR
      JE    gwwordfound
      CMP   AL, "0"
      JL    gwwordfound
      CMP   AL, "9"
      JLE   gwnextchar
      CMP   AL, "A"
      JL    gwwordfound
gwnextchar:
      INC   CX
      JMP   gwsearchwordterm
gwwordfound:
      DEC   SI
gwexit:
      POP   AX
      IRET
;
reverWord:
; Input: BX = address of word
;        CX = length of word
      PUSH  AX
      PUSH  CX
      PUSH  DI
      PUSH  SI
      MOV   DI, BX
      MOV   SI, BX
      ADD   DI, CX
      SHR   CX, 1
      JCXZ  rwexit
rwloop:
      DEC   DI
      MOV   AL, [SI]
      XCHG  AL, [DI]
      MOV   [SI], AL
      INC   SI
      LOOP  rwloop
rwexit:
      POP   SI
      POP   DI
      POP   CX
      POP   AX
      IRET
;
inputSc:
; Input: SI = address of input buffer
;        CL = max chars
      PUSH  AX
      PUSH  BX
      PUSH  DX
      MOV   DX, SI
      MOV   [SI], CL
      INC   SI
      MOV   AH, 0Ah
      INT   21h
      XOR   CH, CH
      MOV   CL, [SI]                            ; String length
      INC   SI
      MOV   BX, SI
      ADD   BX, CX
      MOV   Word Ptr [BX+1], ("$"*256 + LF)     ; String length without CR
      POP   DX
      POP   BX
      POP   AX
      IRET
;
showSd:
; Input: ES:DX = message address
      PUSH  AX
      MOV   AH, 9
      INT   21h
      POP   AX
      IRET
;
afpVold LABEL Dword
kbBuf EQU   afpVold + 4*VectNum
;
      END   START
;

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


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

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

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