Assembly 程序集8086-将一个缓冲区复制到另一个缓冲区

Assembly 程序集8086-将一个缓冲区复制到另一个缓冲区,assembly,x86-16,Assembly,X86 16,我正在编写一个汇编程序,将整个文本文件读入缓冲区,然后在控制台中显示出来。它一次显示24行(每行的最大长度为80,因为我使用的是宽80*25高的dossbox),然后等待用户输入,以便用户可以滚动文本 我想将行号添加到每行的开头,所以我想我可以创建第二个缓冲区,并从第一个缓冲区复制字符1by1,当我找到一个新行时,我会调用一个过程,将行号添加到缓冲区,然后继续,直到我继续通过整个缓冲区。但是我从一个缓冲区复制到另一个缓冲区的方式很糟糕 所以我想复制 布法对布法: mov di,OFFSET BU

我正在编写一个汇编程序,将整个文本文件读入缓冲区,然后在控制台中显示出来。它一次显示24行(每行的最大长度为80,因为我使用的是宽80*25高的dossbox),然后等待用户输入,以便用户可以滚动文本

我想将行号添加到每行的开头,所以我想我可以创建第二个缓冲区,并从第一个缓冲区复制字符1by1,当我找到一个新行时,我会调用一个过程,将行号添加到缓冲区,然后继续,直到我继续通过整个缓冲区。但是我从一个缓冲区复制到另一个缓冲区的方式很糟糕

所以我想复制 布法对布法:

mov di,OFFSET BUFFB ;so i set di to the beggining of bufferB




mov si,Pos         ;Pos is my position in the first buffer
lea bx,BUFFA[si]   ;move the content of buffA to bx , i think the problem is here
mov [di],bx        ;move to the addres of di the content of bx
inc di
inc Pos
问题是,当我打印出第二个缓冲区的内容时,我发现我将si的值(与Pos相同)复制到了我的缓冲区,而不是bufferA[si]的内容。如何修复此代码

编辑1:

因此,解决方案是使用mov和al寄存器:

mov si,Pos
mov al,[BUFF + si]
mov [di],al
inc di
你可以用

lodsb
而不是

mov al,[si]
inc si

而不是

mov [di],al
inc di
在最好的情况下,您可以将两者结合起来

movsb    ; move byte at [si] to [di], and increase both indices
如果您知道要复制多少字节,甚至可以使用“rep”移动内存块,它会在CX次之后重复该指令:

cld                    ; make sure that movsb copies forward
mov si, source_buffer
mov di, dest_buffer
mov cx, #amount of bytes to copy
rep movsb
或填充内存块

cld                  ; make sure that stosb moves forward
mov si, buffer       ; start here
mov al, 0xFF         ; fill with 0xFF
mov cx, #20          ; 20 times
rep stosb
如果您使用的是单词而不是字节,请使用lodsw、stosw和movsw


清除方向标志(通过CLD)时,所有这些指令可以向前(INC si/di)或向后(DEC si/di)。设置方向标志时(通过STD)

lea
(加载扩展地址)加载参数的地址,而不是内容。实际上,您需要一个
mov
here.ty作为快速答案,但是mov bx,offset BUFFB[si]不是合法操作删除
offset
part.ty。我还必须使用al寄存器并删除偏移部分。@500 InternalServerError仅用于记录,它是加载有效地址,不是扩展地址。您可以通过包含
CLD
指令来改进您的答案。这对于字符串原语非常重要,而且常常被忽略。谢谢。我还编辑了你的答案,修正了一些错误(可能是因为匆忙?),投票结果更高!
cld                  ; make sure that stosb moves forward
mov si, buffer       ; start here
mov al, 0xFF         ; fill with 0xFF
mov cx, #20          ; 20 times
rep stosb