Assembly 如何在汇编语言中以null结尾字符串?
我想知道如何在汇编语言中正确地使用null终止字符串:我所做的只是将movq$0(position_to_terminate)设置为null,我认为这将终止我的字符串。然而,当我打印缓冲区时,在空终止符之后仍然有很多东西:Assembly 如何在汇编语言中以null结尾字符串?,assembly,x86-64,att,null-terminated,Assembly,X86 64,Att,Null Terminated,我想知道如何在汇编语言中正确地使用null终止字符串:我所做的只是将movq$0(position_to_terminate)设置为null,我认为这将终止我的字符串。然而,当我打印缓冲区时,在空终止符之后仍然有很多东西: 58 ASSERT(0 == strcmp(buf, "48")); (gdb) print buf $1 = "48\000\000\000\000\000\000\000\000\246\367\377\177\000" (gd
58 ASSERT(0 == strcmp(buf, "48"));
(gdb) print buf
$1 = "48\000\000\000\000\000\000\000\000\246\367\377\177\000"
(gdb) n
Program received signal SIGSEGV, Segmentation fault.
0x0000000000400a78 in testFormatByteAsHex (objs=objs@entry=0x603690)
我真的被这搞糊涂了,因为这在c语言中是有效的,在汇编语言中还有其他终止字符串的方法吗?提前感谢。这是我编写的汇编函数:此函数的目的是读取2个参数,第一个是0到255(%rdi)之间的值,第二个是长度>=2(%rsi)的数组,并将十六进制表示形式存储在%rsi数组中
hex_format_byte_as_hex:
subq $8,%rsp
movq $0,%r10
movq $0,%rdx
.Lhex_format:
cmpq $1,%r10
jg .Lreturn1
movq %rdi,%rax /*store input into %rax*/
movq $16,%rbx /*store 16 into %rbx*/
idivq %rbx /*store dividend in rax, and remainder in rdx*/
cmpq $10,%rdx
jge .Lhex
addq $48,%rdx
jmp .Lstore
.Lhex:
addq $87,%rdx
.Lstore:
movq %rdx,(%rsi,%r10) /*store remainder in %rsi[0]*/
addq $1,%r10 /*increase %r10 by 1*/
movq $0,%rdx
movq %rax,%rdi
jmp .Lhex_format
.Lreturn1:
movq $0,%r11
movq $1,%r10
movq (%rsi,%r10),%r12
movq (%rsi,%r11),%r13
movq %r12,(%rsi,%r11)
movq %r13,(%rsi,%r10)
movq $2,%r10
movb $0,(%rsi,%r10)
addq $8,%rsp
ret
字符串后面总是有东西(除非你点击了一个未映射的页面)。显然,
gdb
正在将buf
打印为数组而不是字符串。使用p/s buf
或类似工具。PS:是的,使用8个零是过分的(并且可能会溢出缓冲区,取决于具体情况)。每次使用2次方的idiv
,都会有一个电子哭泣。此外,您的十六进制数字是向后的:您得到的是低位数字,但存储顺序是递增的。这与印刷顺序相反。请参阅int->hex,它不会让人讨厌。易于扩展到64位输入/16字节ASCII十六进制输出,使用64位调用约定或直接内联。(它不是0终止;在循环后单独添加,或使用固定宽度输出打印,如fwrite
或write
)另请参阅向后存储到缓冲区的base 10函数。