这是一段代码,引起了我的问题:
mystr:
.string "ABCDEFGH"
.set mystrlen, . - mystr
.text
.globl main
.type main, @function
main:
sub $0x10, %rsp
movq $0x44434241, 0x8(%rsp)
lea 0x8(%rsp), %rcx
movq $4, %rax
movq $1, %rbx
//movq $mystr, %rcx
//movq $mystrlen, %rdx
movq $4, %rdx
int $0x80
movq $1, %rax
movq $0, %rbx
int $0x80
表示片段不起作用,因为系统调用args的64位寻址寄存器应分别rdi, rsi, rdx
分别为rbx, rcx, rdx
的第1,第2和第3个系统调用,而不是rbx, rcx, rdx
在x86)。
但是,为什么注释掉的行可以与docker run -dP abcxyz/tomcat catalina.sh run
一起正常工作?
答案 0 :(得分:3)
int $0x80
是32位兼容接口,它恰好也适用于64位进程。它当然使用32位约定,这就是你的代码工作的原因。请注意,它只使用寄存器的低32位,你很幸运,你的字符串在低内存中。尝试使用堆栈上的字符串,该字符串通常超出32位范围,需要64位寄存器,因此需要64位约定。