推送和弹出错误A2070

时间:2016-10-25 17:27:40

标签: assembly x86 masm

当我运行程序时,我得到第16行错误,表示错误A2070,第16行是mov ax, message[si]。是因为我从寄存器搬到了寄存器吗?我怎么能解决这个问题? 该程序是一个简单的push和pop字符串,用于存储堆栈中的每个字符,增加堆栈消息,然后弹出堆栈以向后显示字符串。

;
.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

1 个答案:

答案 0 :(得分: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打印字符串的电话缺少“h”:int 21h