1

假设我有一串 ascii 字符,例如“652+346*779=”,并且我想将一些字符从这个变量移动到另一个变量......

缓冲区是字符串(在本例中为“652+346*779=”),lengthofnum 是相关数字的长度(在本例中,346 的长度为 3) A_ascii 是我试图将字符串传输到的变量“ 346"。

我有一个根本不起作用的循环,我无法弄清楚我应该使用什么寻址模式。emu8086 讨厌我迄今为止尝试过的一切,并给我关于 MOV 指令的语法错误

mov cx,lengthofnum
dumploop1:
    mov bx, offset buffer
    ;dump the number from buffer into A_ascii
    mov A_ascii[cx],[bx]+cx
loop dumploop1:

我收到以下错误代码:

(672) wrong parameters: MOV  A_ascii[cx],[bx]+cx

(672) probably it's an undefined var: A_ascii[cx] 
4

2 回答 2

6

与(显然)流行的看法相反,您可以在 x86 上直接执行 mem->mem 移动,而无需(显式)移入/移出寄存器。由于您已经在 CX 中获得了长度,因此您已经朝着正确的方向开始:

mov si, offset A_ascii
mov di, offset B_ascii
rep movsb    ; automatically uses length from CX
于 2011-11-27T21:37:17.130 回答
1

您不能直接在两个指针之间移动。您需要将其移动到寄存器中以进行临时存储:

mov dx, [bx+cx]
mov [A_ascii+cx], dx

如果您有两个要移动的内存块,通常的方法是这样的:

  xor cx, cx                ; set counter = 0
  mov ax, addressOfSource   ; load base addresses
  mov bx, addressOfDest
move_loop:
  mov dx, [ax+cx]           ; load 2 bytes of data from source
  mov [bx+cx], dx           ; move data into dest
  add cx, 2                 ; increment counter
  cmp cx, dataLength        ; loop while counter < length
  jl move_loop
于 2011-11-27T21:27:59.117 回答