从参数复制到数组

时间:2015-12-17 00:39:50

标签: assembly x86 nasm

我试图将第二个参数复制到声明为的数组: .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

我不认为我正确地复制了数组地址,它不会编译^ 错误是:"操作码和操作数的无效组合"对于标有

的两行

1 个答案:

答案 0 :(得分:3)

由于您无法使用内存中的变量进行寻址,因此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
  

我真的不知道LODSB是如何工作的

然后,您应该阅读有关它的指令集参考页面。它使用esial,但您已经知道,为什么还要将esi加载到地址并在al中预期结果?