我无法分配堆栈变量 - 8086汇编

时间:2012-06-07 18:25:18

标签: assembly x86 stack x86-16

我尝试编写一个获取字符串并在堆栈上复制它的过程。

这是我的代码:

cpyStr proc
    mov bp, sp    
;   save the IP
    mov bx, sp
;   copy the counter loop
    mov cx, [bp+4]
;   make local variable - need 30 bytes
    sub sp, [bp+4] * 2; length is byte so duplicate for word ...
;   copy the string's offset
    mov si, [bp+2] ; offset to si
copy:
    sub bx, 2 ; next word
    mov ax, [si] ; store the character in ax
    mov [bp], ax ; copy to stack's currect word
;   to the next .. 
    add si, 1 ; go to next character
loop copy
;   print
    push bx ; send local string var as parameter for printStr
    call printStr 
;   return the IP
    push    bx
;   returtn to main ....
    ret 4 ; delete 2 parameters 
endp ; end

主:

start:
    mov ax,@DATA
    mov ds,ax
; print
    push strSize
    push offset string
    call cpyStr
; msg
    push offset passed
    call printStr
; end
    mov ah,4ch
    mov al,0
    int 21H
end start

数据段:

string  db "Heello$"
strSize dw  8
passed  db "Passed$"

由于某种原因,它无法成功处理。

3 个答案:

答案 0 :(得分:1)

你至少有三个问题。

首先,通过写入[bp]开始复制,覆盖函数的返回地址。堆栈缓冲区从[sp]开始。 其次,您将向前遍历源缓冲区,向后遍历目标缓冲区,从而反转字符串。 第三,在目标缓冲区中跳过2个字节,但在源缓冲区中只跳过1个字节。 正确的代码应该看起来或多或少像这样

    cpyStr proc
    mov bp, sp
    mov cx, [bp+4]
    sub sp, cx
    add cx, 1
    shr cx, 1
    mov si, [bp+2]
    mov bx, sp
copy:
    mov ax, [si]
    mov [bx], ax
    add bx, 2
    add si, 2
    loop copy

    push sp
    call printStr
    mov sp, bp

答案 1 :(得分:0)

不应该是:数据段中的string db "Hello", $以及passed db "Passed", $

答案 2 :(得分:0)

代码不应该是:

loop copy
mov sp, bx
pop sp           ;pop instead of push
call printStr

ret 4
endp