Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/17.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 将字符从字符串移动到程序集中的寄存器_Assembly_Nasm_X86 16_Dosbox - Fatal编程技术网

Assembly 将字符从字符串移动到程序集中的寄存器

Assembly 将字符从字符串移动到程序集中的寄存器,assembly,nasm,x86-16,dosbox,Assembly,Nasm,X86 16,Dosbox,我正在使用dosBox和nasm来运行这个程序。我试图编写一个汇编程序,它接受用户输入的字符串,然后从该字符串中提取每个字符并将其放入寄存器。我想用mov字节al,msg2就可以了。但是,我收到一个错误,obj输出驱动程序不支持单字节重定位”。我如何从字符串中一次提取一个字符并将其存储到寄存器中 %include "io.mac" .STACK 100H .DATA msg1 db "Please enter your name",0 msg2 TIMES 10 Db 0

我正在使用dosBox和nasm来运行这个程序。我试图编写一个汇编程序,它接受用户输入的字符串,然后从该字符串中提取每个字符并将其放入寄存器。我想用mov字节al,msg2就可以了。但是,我收到一个错误,obj输出驱动程序不支持单字节重定位”。我如何从字符串中一次提取一个字符并将其存储到寄存器中

%include "io.mac"
.STACK 100H 
.DATA
   msg1  db "Please enter your name",0
   msg2   TIMES 10 Db 0

   .CODE
        .STARTUP

    PutStr msg1  ; print msg1 on the output
    nwln
    GetStr  msg2    ; input string into first space in table
    nwln
    PutStr msg2 ; output string in register table
    mov byte al, msg2


    PutStr ax
    done:                        
        .EXIT

如果这是MASM,那么指令
mov al,msg2
将获得字符串的第一个字节,但由于您使用的是NASM,因此需要在需要寻址内存时写入方括号

mov al, [msg2]
当您写入
mov byte al,msg2
时,您要求NASM将msg2的地址放入
al
寄存器,这几乎总是错误的,因为偏移地址应该是16位!这就是您收到错误的原因:

obj输出驱动程序不支持单字节重定位


由于您的目标似乎是一个接一个地获取字符串的每个字符,因此仅获取第一个字符的指令对您帮助不大。您需要将字符串的地址放入寄存器中,读取寄存器指向的内存,然后递增寄存器。在对
AL ,测试寄存器是否指向字符串的最后一个字符,如果没有,则跳回读取下一个字符

    mov     bx, msg2
Next:
    mov     al, [bx]
    inc     bx
    ...
    cmp     bx, msg2 + 10   ;Only if msg2 has precisely 10 characters
    jb      Next
这样的循环只有在用任何代码替换…时才能工作,而不会破坏循环控制寄存器
BX
。如果需要,您可以通过添加
push
pop
指令保存
BX

    mov     bx, msg2
Next:
    mov     al, [bx]
    inc     bx
    push    bx
    ...
    pop     bx
    cmp     bx, msg2 + 10   ;Only if msg2 has precisely 10 characters
    jb      Next

你有没有试过用
mov al,msg2
来代替呢?为什么你“认为”这会起作用?在汇编中,20-30%的事情都是违反常识的(除非你天生像机器一样思考)。而不是使用文档、一些书和/或教程。