8086汇编:MOV部分字符串变为变量

时间:2011-11-27 21:23:52

标签: assembly x86 mov addressing

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

Buffer是字符串(在本例中为“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] 

2 个答案:

答案 0 :(得分:6)

与(显然)流行的看法相反,你可以在x86上进行直接的mem-> mem移动,而不会(明确地)移动到/来自寄存器。由于您已经拥有CX的长度,因此您已经开始朝着正确的方向前进:

mov si, offset A_ascii
mov di, offset B_ascii
rep movsb    ; automatically uses length from CX

答案 1 :(得分: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