Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/assembly/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Assembly 8086汇编:将字符串的一部分放入变量_Assembly_X86_Mov_Addressing - Fatal编程技术网

Assembly 8086汇编:将字符串的一部分放入变量

Assembly 8086汇编:将字符串的一部分放入变量,assembly,x86,mov,addressing,Assembly,X86,Mov,Addressing,假设我有一个ascii字符字符串,如“652+346*779=”,我想将一些字符从这个变量移到另一个变量 缓冲区是字符串(在本例中为“652+346*779=”) lengthofnum是相关数字的长度(在本例中,346的长度为3) ascii是我试图将字符串“346”传输到的变量 我有一个根本不工作的循环,我不知道应该使用什么寻址模式。emu8086讨厌我到目前为止所做的一切,并且在MOV指令的语法方面给了我错误 mov cx,lengthofnum dumploop1: mov bx

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

缓冲区是字符串(在本例中为“652+346*779=”) lengthofnum是相关数字的长度(在本例中,346的长度为3) 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] 

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

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
xor-cx,cx;设置计数器=0
mov ax,源的地址;加载基址
mov bx,测试地址
移动U循环:
mov-dx,[ax+cx];从源加载2字节的数据
mov[bx+cx],dx;将数据移动到dest
添加cx,2;增量计数器
cmp-cx,数据长度;计数器<长度时循环
移动环

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

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
xor-cx,cx;设置计数器=0
mov ax,源的地址;加载基址
mov bx,测试地址
移动U循环:
mov-dx,[ax+cx];从源加载2字节的数据
mov[bx+cx],dx;将数据移动到dest
添加cx,2;增量计数器
cmp-cx,数据长度;计数器<长度时循环
移动环
与(显然)流行的观点相反,您可以在x86上直接执行mem->mem移动,而无需(明确地)在寄存器之间移动。因为您已经有了CX中的长度,所以您已经从正确的方向开始:

mov si, offset A_ascii
mov di, offset B_ascii
rep movsb    ; automatically uses length from CX
与(显然)流行的观点相反,您可以在x86上直接执行mem->mem移动,而无需(明确地)在寄存器之间移动。因为您已经有了CX中的长度,所以您已经从正确的方向开始:

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

是的,您的原始代码的语法似乎有点不正确。我以为你用的是一个奇怪的编译器。我将对其进行编辑以反映这一点。是的,您的原始代码的语法似乎有点不正确。我以为你用的是一个奇怪的编译器。我将对其进行编辑以反映这一点。我忘记了8086上提供了
rep
movsb
。回答得好!:)这个答案是正确的,你应该这样做。不过,我只想补充一点,从来没有
[bx]+cx
。操作数是立即数、寄存器或内存-不能这样混合和匹配。您可以将立即/偏移/缩放与寄存器混合作为地址,格式为[(可选:任何只涉及立即的表达式)+寄存器(可选:将寄存器乘以2、4或8)(可选:+register)]。我忘记了8086上提供了
rep
movsb
。回答得好!:)这个答案是正确的,你应该这样做。不过,我只想补充一点,从来没有
[bx]+cx
。操作数是立即数、寄存器或内存-不能这样混合和匹配。您可以将立即数/偏移量/比例与寄存器混合作为地址,格式为[(可选:任何只涉及立即数的表达式)+寄存器(可选:将寄存器乘以2、4或8)(可选:+register)]。这可能与我如何声明变量有关吗?A_ascii dw 32 dup(?),0h B_ascii dw 32 dup(?),0h A dw 32 dup(?),0h B dw 32 dup(?),0h startofnum dw 00h lengthofnum dw 00h根据您的建议,我得到错误(672)参数:MOV dx,[bx]+cx(672)可能没有十六进制的零前缀;或者没有“h”后缀;或地址错误;或者未定义的var:[bx]+cx这可能与我如何声明变量有关吗?A_ascii dw 32 dup(?),0h B_ascii dw 32 dup(?),0h A dw 32 dup(?),0h B dw 32 dup(?),0h startofnum dw 00h lengthofnum dw 00h根据您的建议,我得到错误(672)参数:MOV dx,[bx]+cx(672)可能没有十六进制的零前缀;或者没有“h”后缀;或地址错误;或未定义的变量:[bx]+cx