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