Перестановка чисел местами - Assembler

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

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

Добрый день, уважаемые друзья! Я написал программу на языке ассемблер по такой задаче: В сегменте данных определить три области: А – 1 байт под одно число; B – по 1 байту под три числа; S – по 1 байту под шесть чисел. В области S поменять местами 1 и 4, 2 и 5, 3 и 6 числа (адресация по базе с индексированием). В качестве буфера можно использовать или регистр BX или область А. ВОТ МОЙ КОД ПРОГРАММЫ,ПОДСКАЖИТЕ ПОЖАЛУЙСТА,КАК ПОМЕНЯТЬ ЧИСЛА МЕСТАМИ?
title     ex_prog
           page      ,132
stack   segment   para stack 'stack'
           db        64 dup('stack   ')
stack   ends
dseg segment para public 'data'
A     db        1 dup(?)
B     db        3 dup(?)
S     db        6 dup(?)
F     db        35,12,46      
dseg    ends
cseg    segment   para public 'code'
our_prog  proc      far
         assume  cs:cseg,ds:dseg,ss:stack
         push      ds
         mov       ax,0
         push      ax
 
         mov       ax,dseg
         mov       ds,ax
         mov al,F
         mov B,al
         mov al,F+1
         mov B+1, al         
         mov al,F+2
         mov B+2, al
         
         mov BX, offset B
         mov al,[BX]
         mov S+2, al
         mov al,[BX]+1
         mov S+1,al
         mov al,[BX]+2
         mov S,al
         mov S+3,43
         mov S+4,23
         mov S+5,37
 
         mov A,0
         
         ret
our_prog  endp
cseg  ends
         end our_prog

Решение задачи: «Перестановка чисел местами»

textual
Листинг программы
org 100h
jmp start
 
mes0  db  13,10,' Digits: $'
mes1  db  13,10,' Result: $'
B     db  3 dup(0)            ; буфер
S     db  6 dup(0),'$'        ; массив чисел (с маркером для fn.9)
 
start:
   mov   ah,9            ; запрос на ввод чисел
   mov   dx,mes0         ;
   int   21h             ;
 
   mov   cx,6            ; макс.6 чисел
   mov   di,S            ; адрес приёмника
   mov   ah,8            ; ввод без эха средствами DOS
input:                   ;
   int   21h             ; сл.символ..
   cmp   al,'0'          ; ингорируем всё,
   jb    input           ;    ..кроме чисел
   cmp   al,'9'          ;
   ja    input           ;
   stosb                 ; запись символа в DI
   int   29h             ; вывод его на экран
   loop  input           ; мотаем 6 раз..
;====================================================
   mov   cx,3            ; сколько символов копировать
   push  cx cx           ; запомним..
   mov   si,S            ; источник
   mov   di,B            ; приёмник
   rep   movsb           ; скопировали первую триаду в буфер
   pop   cx              ; восстановили СХ
   mov   di,S            ; приёмник = источнику
   rep   movsb           ; скопировали вторую триаду в первую
   pop   cx              ;
   mov   si,B            ; меняем источник на буфер
   rep   movsb           ; скопировали первую триаду во-вторую
;====================================================
   mov   ah,9            ; мессага
   mov   dx,mes1         ;
   int   21h             ;
   mov   dx,S            ; выводим результат на экран
   int   21h             ;
 
exit:                    ;
   xor   ax,ax           ;
   int   16h             ;
   int   20h             ; выход

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

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