Сборка значений подкачки в массиве x8086 - PullRequest
0 голосов
/ 18 декабря 2018

У меня есть вопрос, чтобы написать код, который получит 8 символов / цифр, и он будет менять местами каждые 2 байта.

Пример:

input 451ABD45

ARR = | 34 | 35 | 31 | 41 | 42 | 44 | 34 | 35

NewARR = | 35 | 34 | 41 | 31 | 44 | 42 | 35 | 34

выход 54A1DB54

Мой код:

STA SEGMENT STACK
    DB 100H DUP (0)
STA ENDS

DATA SEGMENT
    MSG DB 'Please Enter 8 Chars : $'
    DIM DW 10 DUP(?)
DATA ENDS

CODE SEGMENT
    ASSUME CS:CODE,DS:DATA,SS:STA
MAIN:
    MOV AX, DATA
    MOV DS, AX
    LEA DX, MSG
    MOV AH, 9H
    INT 21H
    MOV DL, 10
    MOV AH, 02H
    INT 21H
    MOV DL, 13
    MOV CX, 8
    MOV BX, 0
    MOV DX, 0
INPUT:
    MOV AH, 1H
    INT 21H
    MOV AH, 0
    MOV DIM[BX], AX
    INC BX
    LOOP INPUT
    MOV CX, 4
    MOV BX, 0
EXCHANGE:
    MOV DX, DIM[BX] ;0
    INC BX ;1
    MOV AX, DIM[BX] ;1
    DEC BX ;0
    MOV DIM[BX], AX ;0
    ADD BX, 1 ;1
    MOV DIM[BX], DX ;1
    INC BX
    LOOP EXCHANGE
    MOV DL, 10
    MOV AH, 02H
    INT 21H
    MOV DL, 13
    MOV CX, 8
    MOV BX, 0
    MOV DX, 0
PRINT:
    MOV DX, DIM[BX]
    INC BX
    MOV AH, 2H
    INT 21H
    LOOP PRINT
    MOV AX, 4C00H
    INT 21H
CODE ENDS
    END MAIN

My_input 451ABD45

ARR = | 34 | 35 | 31 | 41 | 42 | 44 | 34 | 35

MY_NewARR = | 35 | 34 | 41 | 35 | 44 | 41 | 35 | 44

My_output 54A5DA5D

Что не так с моим кодом, спасибо за любую помощь

1 Ответ

0 голосов
/ 18 декабря 2018

Вы загружаете и сохраняете слова (16-битные значения), в то время как ваши символы по одному байту каждый.

Например, перед первой итерацией у вас есть это:

'4','5','1','A','B','D','4','5'

И после первой итерации у вас должно получиться следующее:

'5','4','1','A','B','D','4','5'
 |   |
 \  /
swapped

Но в итоге вы сделаете следующее:

'5','1','1','A','B','D','4','5'
|    |
\   /
AX is stored

'5','4','5','A','B','D','4','5'
    |    |
    \   /
    DX is stored

И так далее для остальной части строки.


Фиксированный и несколько упрощенный цикл обмена может выглядеть следующим образом:

EXCHANGE:
  MOV DH,BYTE PTR [BX + DIM]   ; First character in high byte of DX
  MOV DL,BYTE PTR [BX + DIM+1] ; Second character in low byte of DX
  MOV [BX + DIM],DX            ; DX contains the byte-swapped pair
  ADD BX,2                     ; Move to next pair of characters
  LOOP EXCHANGE
...