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