Assembly x86程序集-如何将字符串复制到本地(堆栈)变量中?

Assembly x86程序集-如何将字符串复制到本地(堆栈)变量中?,assembly,dos,x86-16,Assembly,Dos,X86 16,我必须创建一个接收两个参数的过程:(在堆栈上): 一个字符串的开头-一个字节数组 绳子的长度 我必须创建一个局部变量,并将字符串复制到变量中 然后我试着把它打印出来。它不起作用 .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+

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

  • 一个字符串的开头-一个字节数组

  • 绳子的长度

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

然后我试着把它打印出来。它不起作用

.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

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

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

此外,您在此处使用2个字节进行复制:

mov ax, [si]
mov [di], ax
应该是:

mov al, [si]
mov [di], al
cmp al, 0
je finished
inc si
inc di
jmp loop


按下
bp
,第一个(最后一次按下)参数位于
[bp+4]
<代码>[bp+2]是您的回信地址。。。哪些是随机字符的原因…

对于你来说,在做大之前先从小开始可能更容易

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

.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
在变得更复杂之前把它打印出来,然后一旦你知道它可以打印出来,一次一个阶段地把它构建成一个完整的堆栈函数

.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