1

文字列を取得してスタックにコピーするプロシージャを作成しようとしています。

それは私のコードです:

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$"

何らかの理由で正常に処理されません。

4

3 に答える 3

1

少なくとも3つの問題があります。

まず、コピーは[bp]に書き込み、関数のリターンアドレスを上書きすることから始まります。スタックバッファは[sp]から始まります。次に、ソースバッファを順方向にトラバースし、デスティネーションバッファを逆方向にトラバースして、文字列を逆にします。第3に、宛先バッファーでは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
于 2012-06-08T22:18:09.270 に答える
0

すべきではない:string db "Hello", $データセグメントと同様にpassed db "Passed", $

于 2012-06-07T18:39:55.483 に答える
0

コードは次のようにすべきではありません:

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

ret 4
endp
于 2012-06-08T22:03:30.610 に答える