Проблема обращения строки в сборке 8086 - PullRequest
0 голосов
/ 24 ноября 2018

Мне нужно отменить данную строку в сборке 8086. Я написал код, который должен работать, но я получаю вывод

'MAGSM $ HIMI

вместо

MAGSHIMIM

Я не могу понять, в чем проблема с кодом.Я подозреваю, что "$" вызывает проблему, но я понятия не имею.

Мой код:

 org 100h

jmp main    
    chrs db  'M','I','M','I','H','S','G','A','M', '$'


main:
    mov bp, sp

    mov ax,offset chrs
    call print_ax_str 
    mov ax, offset chrs
    push ax
    push 9
    call reverse
    PRINTN ;new line
    mov ax,offset chrs
    call print_ax_str 

    jmp stop

reverse proc
    ; First save the old BP  
    push bp 
    ; Now establish new BP 
    mov bp, sp  
    ;make space for 2 local variables
    sub sp, 4

    mov dx, [bp+6]
    mov bx, [bp+4] ;bx = 9
    dec bx         ;bx = 8
    add dx, bx ; dx = dx + 8    
    mov di, dx 
    mov SI, [bp+6] 
    mov cx, 4
    L1: 
    mov dx, [si]    
    xchg ax, [di]  
    mov [si], ax
    mov [di], dx 
    inc si        ;si--
    dec di        ;di++

    loop L1

    mov sp, bp 
    ; Restore OLD BP 
    pop bp
    retn 4 
reverse endp


stop:
    mov ah, 0 
    int 16h 
    ret

include magshimim.inc

1 Ответ

0 голосов
/ 24 ноября 2018
chrs db  'M','I','M','I','H','S','G','A','M', '$'
 ...
L1: 
 mov dx, [si]    
 xchg ax, [di]  
 mov [si], ax
 mov [di], dx 
 inc si        ;si--
 dec di        ;di++
 loop L1

Самая большая проблема здесь в том, что ваша строка chrs содержит байты, но ваша процедура обращения работает со словами (2 байта).

Глядя на этоцикл Я подозреваю, что вы смешали 2 решения обратной проблемы.Инструкция xchg ax, [di] говорит об этом.

Решение 1 с использованием MOV

L1: 
 mov dl, [si]    
 mov al, [di]  
 mov [si], al
 mov [di], dl 
 inc si        ;si++
 dec di        ;di--
 loop L1

Решение 2 с использованием XCHG

L1: 
 mov dl, [si]    
 xchg dl, [di]  
 mov [si], dl
 inc si        ;si++
 dec di        ;di--
 loop L1

Обратите внимание, что комментарии вваш код был неверным.Увеличение SI соответствует "si ++".Аналогично, уменьшение DI соответствует «di -».


Поскольку вы передаете длину строки процедуре и на ней основаны указатели, вы также должны основать на ней свой счетчик циклаи не используйте фиксированный счет 4 через mov cx, 4.

 mov cx, [bp+4]   ;SLen
 shr cx, 1        ;SLen/2
L1:

С дополнительной очисткой:

reverse proc
 push bp 
 mov  bp, sp
 mov  cx, [bp+4] ;SLen
 mov  si, [bp+6]
 mov  di, si
 add  di, cx
 dec  di
 shr  cx, 1      ;SLen/2
L1: 
 mov  dl, [si]    
 mov  al, [di]  
 mov  [si], al
 mov  [di], dl 
 inc  si        ;si++
 dec  di        ;di--
 loop L1
 pop  bp
 retn 4 
reverse endp
...