Assembly 如何在汇编语言中以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

我想知道如何在汇编语言中正确地使用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"
(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函数。