Переставить во всех словах буквы в обратном порядке - 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 ;
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д