2011-11-27 59 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

相關問題