Assembly 如何在x86汇编中将字符从一个内存位置复制到另一个内存位置?

Assembly 如何在x86汇编中将字符从一个内存位置复制到另一个内存位置?,assembly,x86,nasm,Assembly,X86,Nasm,我正在尝试使用16位程序集复制字符串 我在.dirBafer中有16个11个字符的字符串,我想将每个字符串复制到.ime_dat中,以便我可以打印它并在以后处理它(处理代码尚未编写)。每个字符串的第一个字符由32字节的数据分隔。基本上,.dirbafer是FAT12目录的转储,我正在尝试打印文件名 我有以下代码: mov dx, .dirBafer ;loads address of .dirBafer in dx mov cx, 16 ;16 entries in a dir .load_di

我正在尝试使用16位程序集复制字符串

我在.dirBafer中有16个11个字符的字符串,我想将每个字符串复制到.ime_dat中,以便我可以打印它并在以后处理它(处理代码尚未编写)。每个字符串的第一个字符由32字节的数据分隔。基本上,.dirbafer是FAT12目录的转储,我正在尝试打印文件名

我有以下代码:

mov dx, .dirBafer ;loads address of .dirBafer in dx
mov cx, 16 ;16 entries in a dir
.load_dir:

            push cx
            mov ax, dx ;loads address of .dirBafer from dx into ax
            mov bx, .ime_dat ;buffer for storing file names
            mov cx, 11 ;each file name is 11 characters long
.ime_dat_str:
            push dx ; push dx, since it's being used as a temporary register
            mov dx, [ax] ;this is supposed to load first char from location pointed byax to dx
            mov [bx], dx ;this is supposed to load the first char from  location pointed by dx to bx

            add ax, 1 ; moving on to the next character
            add bx, 1 ;moving on to the next character

            pop dx ; we pop the dx so that the original value returns
            loop .ime_dat_str ;this should loop for every character in the file name


            mov si, bx ;preparing to print the file name
            call _print_string ; printing the name
            add dx, 32 ; we move to the next dir entry
            pop cx ; popping cx so that the outer look counter can be updated
            loop .load_dir

.dirBafer   times 512 db 0
.ime_dat    times 12 db 0
我的问题是线路:

mov-dx,[ax]
生成无效有效地址错误


我做错了什么?如何修复它?

DX是一个2字节寄存器。如果只想访问一个字节,则应使用DL寄存器:

mov dl, [ax]
mov [bx], dl

好的,我知道了。似乎对于这样的操作,我需要使用si和di寄存器,而不是ax和bx。它们被恰当地命名为源索引和目标索引寄存器。

是的,没错,但这个答案对我没有帮助。即使我这样做,我也会犯同样的错误。尽管如此,您的努力还是得到了+。是否有可能_print_string更改了dx的值?这似乎是ax可能成为无效地址的唯一原因。不,打印字符串在开始时是
pusha
,在结束时是
popa
,并且它不使用dx。ax不符合索引寄存器的使用条件。如果您查找系统ABI的暂存寄存器,可能会有所帮助,因为这些寄存器不会在调用期间保留(通常是EAX、ECX和EDX)。@Necrolis在我的特殊情况下,它们是(嗯,我正在使用的).只是要明确一点:如果不是,我会出现运行时错误,对吗?我在组装过程中也会出现错误。啊,没关系,这里有点晚了,而且我没有直读:但是,还是看看你系统的ABI,从长远来看,它可能会对你有所帮助:)@Necrolis我已经阅读了整个系统的源代码大约20次。幸运的是,它没有那么大,可能只有约5000条生产线在组装。正是NASM的行为困扰着我。@Necrolis在我的案例中归结为操作系统的来源,因为没有一个书面的标准。