将字符从字符串移动到汇编中的寄存器
Move character from a string to a register in Assembly
我正在使用 dosBox 和 nasm 来 运行 这个程序。我正在尝试编写一个汇编程序,它接受用户输入的字符串,然后从该字符串中取出每个字符并将其放入寄存器中。我以为做 mov byte 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
指令 mov al, msg2
会得到字符串的第一个字节 如果 这是 MASM,但是因为你使用的是 NASM 你需要每当你想寻址内存时写方括号。
mov al, [msg2]
当你写 mov byte al, msg2
时,你要求 NASM 将 msg2 的地址放入 AL
寄存器中,这几乎总是错误的因为偏移地址应该是 16 位的!这就是您收到错误的原因:
obj output driver does not support one-byte relocations
由于您的目标似乎是一个接一个地获取字符串的每个字符,因此仅获取第一个字符的指令对您的帮助不大。您需要将字符串的地址放在寄存器中,读取该寄存器指向的内存,然后递增寄存器。在用 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
我正在使用 dosBox 和 nasm 来 运行 这个程序。我正在尝试编写一个汇编程序,它接受用户输入的字符串,然后从该字符串中取出每个字符并将其放入寄存器中。我以为做 mov byte 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
指令 mov al, msg2
会得到字符串的第一个字节 如果 这是 MASM,但是因为你使用的是 NASM 你需要每当你想寻址内存时写方括号。
mov al, [msg2]
当你写 mov byte al, msg2
时,你要求 NASM 将 msg2 的地址放入 AL
寄存器中,这几乎总是错误的因为偏移地址应该是 16 位的!这就是您收到错误的原因:
obj output driver does not support one-byte relocations
由于您的目标似乎是一个接一个地获取字符串的每个字符,因此仅获取第一个字符的指令对您的帮助不大。您需要将字符串的地址放在寄存器中,读取该寄存器指向的内存,然后递增寄存器。在用 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