Сборка 8086: MOV часть строки в переменную - PullRequest
1 голос
/ 28 ноября 2011

Предполагается, что у меня есть строка символов 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] 

Ответы [ 2 ]

6 голосов
/ 28 ноября 2011

Вопреки (очевидно) распространенному мнению, вы можете сделать прямое перемещение мем-> мем на x86, без (явно) перемещения в / из регистра. Поскольку у вас уже есть длина в CX, вы уже начали в правильном направлении:

mov si, offset A_ascii
mov di, offset B_ascii
rep movsb    ; automatically uses length from CX
1 голос
/ 28 ноября 2011

Вы не можете напрямую перемещаться между двумя указателями. Вам необходимо переместить его в реестр для временного хранения:

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
...