2016-10-25 3 views
0

Когда я запускаю программу, я получаю ошибку строки 16, которая говорит об ошибке A2070, строка 16 - mov ax, message[si]. Это потому, что я перехожу из регистра в регистр? Также как я могу исправить эту проблему? Программа представляет собой простой толчок и поп строки, в которой каждый символ в стеке увеличивает сообщение стека, а затем выталкивает стек, чтобы отобразить строку назад.push and pop error A2070

; 
.model small 
.data 
message db "Hello, DOS Here!",0 ; the string 
nameSize = ($ - message) - 1  ;gives length of the string 
.code 
main proc 
mov ax,@data 
mov ds,ax 

mov cx, nameSize  ;size of the string stored in cx 
mov si, 0    ;stack index 0 
Li: 
    mov ax, message[si]  ; 
    push ax     ;push ax 
    inc si     ;incremting stack index 
    loop Li     ; looping through message character 

mov cx, nameSize   ;Popping 
mov si, 0     ; popping from stack 

L2: 
    pop ax     ;pop of the ax 
    mov message[si], al  ; 
    inc si 
    loop L2 

mov dx, offset message  ; displaying of string 
mov ah,9 
int 21 

mov ax,4c00h 
int 21h 
main endp 
end main 

ответ

3

Вы объявили вашу строку как тип DB:

 ▼ 
message db "Hello, DOS Here!",0 ; the string 

DB означает «один байт», но вы движетесь один байт в два байта регистр AX, который является размер конфликта. Давайте исправим это:

mov cx, nameSize  ;size of the string stored in cx 
mov si, 0    ;stack index 0 
xor ax, ax    ;◄■■■ CLEAR AX. 
Li: 
    mov al, message[si]  ;◄■■■ USE AL. 
    push ax     ;push ax 
    inc si     ;incremting stack index 
    loop Li     ; looping through message character 

Кстати, ваш призыв к int 21 для печати строка отсутствует «Н»: int 21h.

+0

спасибо, теперь я понимаю, что это исправить проблему, но когда я запускаю программу в поле dos, она показывает пустую программу, не печатает обратную строку @jose –

+0

@MikeShasaco, еще одна ошибка: ваша строка должна заканчиваться на «$» вместо «0» (потому что вы используете int 21h ah = 09). –

+0

Спасибо, что это сработало, но оно также напечатало кучу случайных символов ascii, но оно напечатало строку назад. @jose –