0

我必须创建一个接收两个参数的过程:(在堆栈上):

  • 一个字符串 - 一个字节数组。

  • 字符串的长度。

我必须创建一个局部变量,并将字符串复制到变量中。

然后我正在尝试打印它。它不起作用。

.model small
.stack 64

.data
str1 db "Hello world$"
len  dw $-str1

.code

print proc
    push bp ; save bp
    mov bp, sp
    mov cx, [bp+4]
    mov di, [bp+2]
    mov ah, 02
do1:
    mov dl, ss:[si]
    int 21H
    inc si
loop do1
    pop bp
    ret 4
endp print

cpy proc
   mov bp, sp
   mov si, [bp+2] ; string's offset
   mov cx, [bp+4] ; string's length
   sub sp, cx     ; create cx'th byte array
   mov di, sp
do:
   mov ax, [si]
   mov [di], ax
   inc si
   inc di
loop do
  add sp, [bp+4] ; restore stack
  ; print

  push len
  push sp
  call print

  ret 4
endp cpy

start:
    mov ax, @DATA
    mov ds, ax

    push len
    push offset str1
    call cpy

    mov al, 0
    mov ah, 4ch
    int 21H
end start

它打印一些“随机”值。你知道为什么吗?

4

3 回答 3

0

print proc
    push bp ; save bp
    mov bp, sp
    mov cx, [bp+4]
    mov di, [bp+2]

pushbp后,您的第一个(最后一次推送)参数位于[bp + 4][bp + 2]是你的寄信人地址...它解释了随机字符...

于 2013-06-02T19:50:06.953 回答
0

在做大之前可能更容易从小处着手

然后您可以在构建例程时进行调试

.data
str1 db "Hello world$"
.data1

mov si,data        ;stringstart
mov cx,data1-data  ;stringlength

do:
   mov al, [si]
   mov [di], al
   inc si
   inc di
loop do

在变得更复杂之前把它打印出来,然后一旦你知道它可以打印出来,就将它构建成一个完整的堆栈函数,一次一个阶段

于 2013-06-03T08:36:57.453 回答
0

在您的复制过程中,您没有循环,您只是复制字符串的第一个字节。

您还在这里复制 2 个字节:

mov ax, [si]
mov [di], ax

应该:

mov al, [si]
mov [di], al
cmp al, 0
je finished
inc si
inc di
jmp loop
于 2013-06-02T18:37:28.650 回答