Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 从参数复制到数组_Assembly_X86_Nasm - Fatal编程技术网

Assembly 从参数复制到数组

Assembly 从参数复制到数组,assembly,x86,nasm,Assembly,X86,Nasm,我正在尝试将第2个参数复制到声明为: .bss X:resb 20 我不知道该怎么做。以下是我的尝试: 参数以终止(0x0)字符结尾 %include "asm_io.inc" global asm_main section .data section .bss temp: resd 1 i: resd 1 X: resb 20 length: resd 1 ; length of input section .text asm_main: enter 0, 0

我正在尝试将第2个参数复制到声明为:
.bss X:resb 20

我不知道该怎么做。以下是我的尝试:

参数以终止(0x0)字符结尾

%include "asm_io.inc"
global asm_main

section .data

section .bss
  temp: resd 1
  i: resd 1
  X: resb 20

  length: resd 1 ; length of input

section .text

asm_main:
  enter 0, 0
  pusha

  mov ebx, dword [ebp+12]
  mov esi, dword [ebx+4]
loop: lodsb
  ; end of string?
  or al, al
  jz endloop

  ; copy arg[1] to x ================
  mov temp, X         ;error; temp = address of X 
  add temp, dword [i] ;error; temp += i
  mov byte [temp], al ;     ; temp[i] = al
  add dword [i], 1          ; i++
  ; =================================

  jmp loop
endloop:
  popa
  leave
  ret
我认为我没有正确复制数组地址,它无法编译^
对于标记为

的两行,错误是:“操作码和操作数的组合无效”。由于无法使用内存中的变量进行寻址,因此您的
temp
无效。您必须为它选择一个寄存器,例如,
edi
。那么该块可能看起来像:

  mov edi, X
  add edi, [i]
  mov [edi], al
  mov esi, [ebp+12]
  mov esi, [esi+4]
  mov edi, X
loop:
  lodsb
  stosb
  ; end of string?
  or al, al
  jnz loop
这当然过于复杂了,初学者代码通常也是如此。更简单的版本可能如下所示:

  mov edi, X
  add edi, [i]
  mov [edi], al
  mov esi, [ebp+12]
  mov esi, [esi+4]
  mov edi, X
loop:
  lodsb
  stosb
  ; end of string?
  or al, al
  jnz loop
我真的不知道LODSB是怎么工作的


然后,您应该阅读有关它的说明集参考页。它使用
esi
al
,但是您已经知道,否则为什么要将
esi
与地址一起加载,并期望在
al
中得到结果呢?

ebp
根本没有初始化。如果你想使用它,你需要自己设置。我没有把所有的代码都放进去,如果你需要的话我可以。我已经检查过它是否有效,甚至打印出了论点。添加了剪断线。请参阅。另外,不会编译是一个糟糕的问题描述,您至少应该提供错误消息并标记相关行。这就是说,
mov dword[temp],al
绝对是错误的,因为
al
不是dword。我不确定你想用
temp
做什么。对不起,我只是觉得我忽略了一件简单的事情。已编辑^x86不能同时为两个操作数占用内存。必须为
mov
add
的至少一个操作数使用寄存器。