2011-11-27 58 views
1

的MOV一部分假设我有一个ASCII字符,如“652 + 346 * 779 =”字符串,我想从这个变量将一些字符到另一个变量...8086组件:一个字符串转换为可变

缓冲区是字符串(在本例中为“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] 
+0

可能它与我如何声明变量有关? \t A_ascii DW 32 DUP(?),0H \t B_ascii DW 32 DUP(?),0H \t甲DW 32 DUP(?),0H \t乙DW 32 DUP(?),0H \t startofnum DW 00H \t lengthofnum DW 00H 随着你的建议,我得到的错误 (672)错误参数:MOV DX,[BX] + CX (672)可能没有零前缀十六进制;或没有'h'后缀;或错误的寻址;或undefined var:[bx] + cx – user979388

回答

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 
+0

当我使用你的第一个建议时,我得到错误 – user979388

+0

是的,看起来你的原始代码的语法有点偏离。我假设你正在使用一个奇怪的编译器。我会编辑它以反映这一点。 – Polynomial

6

相反到(显然)普遍的信仰,你可以直接的MEM> MEM移动在x86处理器上,没有(明确)移动/从寄存器。由于您已经拥有CX的长度,您已经开始朝着正确的方向发展:

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

我忘了'rep'和'movsb'可在8086很好的回答! :) – Polynomial

+0

这个答案是正确的,你应该怎么做。不过,我只想补充一点,那就是没有'[bx] + cx'。操作数只有立即数,寄存器或内存 - 你不能像这样混合和匹配。你可以用[[可选:任何只涉及立即数的表达式] +寄存器(可选:乘以2,4或8的寄存器)[可选:+寄存器]]形式的寄存器作为地址混合立即数/偏移量/ – sqykly

相关问题