How are parameters accepted by standard c functions in assembly? [duplicate]
This question already has an answer here:
What are the calling conventions for UNIX & Linux system calls on i386 and x86-64
3 answers
Where is the x86-64 System V ABI documented?
1 answer
I have 64-bit MacOS assembly code which performs binary search on an array. Binary search in standard C library is:
void* bsearch (const void* key, const void* base,
size_t num, size_t size,
int (*compar)(const void*,const void*));
And my assembly looks like
mov %edi,0x2(%rsp)
mov $0x2010,%r8d
mov $0x4,%ecx
lea 0x2(%rsp),%rdi
callq <bsearch@plt>
I am wondering if there is any definitive order of parameters that the bsearch
takes, i.e. is there any way of knowing what rdi, ecx, r8d
correspond to here? Is it key
, base
, compar
?
c assembly x86-64
marked as duplicate by Peter Cordes
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 24 '18 at 5:12
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
add a comment |
This question already has an answer here:
What are the calling conventions for UNIX & Linux system calls on i386 and x86-64
3 answers
Where is the x86-64 System V ABI documented?
1 answer
I have 64-bit MacOS assembly code which performs binary search on an array. Binary search in standard C library is:
void* bsearch (const void* key, const void* base,
size_t num, size_t size,
int (*compar)(const void*,const void*));
And my assembly looks like
mov %edi,0x2(%rsp)
mov $0x2010,%r8d
mov $0x4,%ecx
lea 0x2(%rsp),%rdi
callq <bsearch@plt>
I am wondering if there is any definitive order of parameters that the bsearch
takes, i.e. is there any way of knowing what rdi, ecx, r8d
correspond to here? Is it key
, base
, compar
?
c assembly x86-64
marked as duplicate by Peter Cordes
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 24 '18 at 5:12
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
It depends on the calling convention for the platform you are on. For example the Calling Convention for 64-bit Windows is different than 64-bit Linux (or OSX) code. Looking at the code you provided I can infer you are not targeting Windows and you appear to be using a system that uses the AMD64 System V ABI. You can find a summary of the calling convention and the registers used here .A complete copy can be found here
– Michael Petch
Nov 24 '18 at 4:57
Thanks. I am using OSX.
– dipankar
Nov 24 '18 at 4:59
Yep, OSX uses the AMD64 System V ABI so the links I gave should apply.
– Michael Petch
Nov 24 '18 at 4:59
the linked duplicate covers the normal function calling convention as well as the system-call calling convention.
– Peter Cordes
Nov 24 '18 at 5:13
add a comment |
This question already has an answer here:
What are the calling conventions for UNIX & Linux system calls on i386 and x86-64
3 answers
Where is the x86-64 System V ABI documented?
1 answer
I have 64-bit MacOS assembly code which performs binary search on an array. Binary search in standard C library is:
void* bsearch (const void* key, const void* base,
size_t num, size_t size,
int (*compar)(const void*,const void*));
And my assembly looks like
mov %edi,0x2(%rsp)
mov $0x2010,%r8d
mov $0x4,%ecx
lea 0x2(%rsp),%rdi
callq <bsearch@plt>
I am wondering if there is any definitive order of parameters that the bsearch
takes, i.e. is there any way of knowing what rdi, ecx, r8d
correspond to here? Is it key
, base
, compar
?
c assembly x86-64
This question already has an answer here:
What are the calling conventions for UNIX & Linux system calls on i386 and x86-64
3 answers
Where is the x86-64 System V ABI documented?
1 answer
I have 64-bit MacOS assembly code which performs binary search on an array. Binary search in standard C library is:
void* bsearch (const void* key, const void* base,
size_t num, size_t size,
int (*compar)(const void*,const void*));
And my assembly looks like
mov %edi,0x2(%rsp)
mov $0x2010,%r8d
mov $0x4,%ecx
lea 0x2(%rsp),%rdi
callq <bsearch@plt>
I am wondering if there is any definitive order of parameters that the bsearch
takes, i.e. is there any way of knowing what rdi, ecx, r8d
correspond to here? Is it key
, base
, compar
?
This question already has an answer here:
What are the calling conventions for UNIX & Linux system calls on i386 and x86-64
3 answers
Where is the x86-64 System V ABI documented?
1 answer
c assembly x86-64
c assembly x86-64
edited Nov 24 '18 at 5:10
Michael Petch
25.8k556102
25.8k556102
asked Nov 24 '18 at 4:42
dipankardipankar
344
344
marked as duplicate by Peter Cordes
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 24 '18 at 5:12
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
marked as duplicate by Peter Cordes
StackExchange.ready(function() {
if (StackExchange.options.isMobile) return;
$('.dupe-hammer-message-hover:not(.hover-bound)').each(function() {
var $hover = $(this).addClass('hover-bound'),
$msg = $hover.siblings('.dupe-hammer-message');
$hover.hover(
function() {
$hover.showInfoMessage('', {
messageElement: $msg.clone().show(),
transient: false,
position: { my: 'bottom left', at: 'top center', offsetTop: -7 },
dismissable: false,
relativeToBody: true
});
},
function() {
StackExchange.helpers.removeMessages();
}
);
});
});
Nov 24 '18 at 5:12
This question has been asked before and already has an answer. If those answers do not fully address your question, please ask a new question.
It depends on the calling convention for the platform you are on. For example the Calling Convention for 64-bit Windows is different than 64-bit Linux (or OSX) code. Looking at the code you provided I can infer you are not targeting Windows and you appear to be using a system that uses the AMD64 System V ABI. You can find a summary of the calling convention and the registers used here .A complete copy can be found here
– Michael Petch
Nov 24 '18 at 4:57
Thanks. I am using OSX.
– dipankar
Nov 24 '18 at 4:59
Yep, OSX uses the AMD64 System V ABI so the links I gave should apply.
– Michael Petch
Nov 24 '18 at 4:59
the linked duplicate covers the normal function calling convention as well as the system-call calling convention.
– Peter Cordes
Nov 24 '18 at 5:13
add a comment |
It depends on the calling convention for the platform you are on. For example the Calling Convention for 64-bit Windows is different than 64-bit Linux (or OSX) code. Looking at the code you provided I can infer you are not targeting Windows and you appear to be using a system that uses the AMD64 System V ABI. You can find a summary of the calling convention and the registers used here .A complete copy can be found here
– Michael Petch
Nov 24 '18 at 4:57
Thanks. I am using OSX.
– dipankar
Nov 24 '18 at 4:59
Yep, OSX uses the AMD64 System V ABI so the links I gave should apply.
– Michael Petch
Nov 24 '18 at 4:59
the linked duplicate covers the normal function calling convention as well as the system-call calling convention.
– Peter Cordes
Nov 24 '18 at 5:13
It depends on the calling convention for the platform you are on. For example the Calling Convention for 64-bit Windows is different than 64-bit Linux (or OSX) code. Looking at the code you provided I can infer you are not targeting Windows and you appear to be using a system that uses the AMD64 System V ABI. You can find a summary of the calling convention and the registers used here .A complete copy can be found here
– Michael Petch
Nov 24 '18 at 4:57
It depends on the calling convention for the platform you are on. For example the Calling Convention for 64-bit Windows is different than 64-bit Linux (or OSX) code. Looking at the code you provided I can infer you are not targeting Windows and you appear to be using a system that uses the AMD64 System V ABI. You can find a summary of the calling convention and the registers used here .A complete copy can be found here
– Michael Petch
Nov 24 '18 at 4:57
Thanks. I am using OSX.
– dipankar
Nov 24 '18 at 4:59
Thanks. I am using OSX.
– dipankar
Nov 24 '18 at 4:59
Yep, OSX uses the AMD64 System V ABI so the links I gave should apply.
– Michael Petch
Nov 24 '18 at 4:59
Yep, OSX uses the AMD64 System V ABI so the links I gave should apply.
– Michael Petch
Nov 24 '18 at 4:59
the linked duplicate covers the normal function calling convention as well as the system-call calling convention.
– Peter Cordes
Nov 24 '18 at 5:13
the linked duplicate covers the normal function calling convention as well as the system-call calling convention.
– Peter Cordes
Nov 24 '18 at 5:13
add a comment |
1 Answer
1
active
oldest
votes
There are two possible calling conventions, depending on your OS (see here for more details). On Microsoft, the order is RCX, RDX, R8, R9. On Unix, the order is RDI, RSI, RDX, RCX, R8, R9. Note that the "r" or "e" at the beginning just indicates whether you are using all 64 bits of the register (r) or only the lower 32 bits (e). So in your case, I would guess that you are using Unix and the correspondence is rdi=key, ecx=size, r8d=compar.
add a comment |
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
There are two possible calling conventions, depending on your OS (see here for more details). On Microsoft, the order is RCX, RDX, R8, R9. On Unix, the order is RDI, RSI, RDX, RCX, R8, R9. Note that the "r" or "e" at the beginning just indicates whether you are using all 64 bits of the register (r) or only the lower 32 bits (e). So in your case, I would guess that you are using Unix and the correspondence is rdi=key, ecx=size, r8d=compar.
add a comment |
There are two possible calling conventions, depending on your OS (see here for more details). On Microsoft, the order is RCX, RDX, R8, R9. On Unix, the order is RDI, RSI, RDX, RCX, R8, R9. Note that the "r" or "e" at the beginning just indicates whether you are using all 64 bits of the register (r) or only the lower 32 bits (e). So in your case, I would guess that you are using Unix and the correspondence is rdi=key, ecx=size, r8d=compar.
add a comment |
There are two possible calling conventions, depending on your OS (see here for more details). On Microsoft, the order is RCX, RDX, R8, R9. On Unix, the order is RDI, RSI, RDX, RCX, R8, R9. Note that the "r" or "e" at the beginning just indicates whether you are using all 64 bits of the register (r) or only the lower 32 bits (e). So in your case, I would guess that you are using Unix and the correspondence is rdi=key, ecx=size, r8d=compar.
There are two possible calling conventions, depending on your OS (see here for more details). On Microsoft, the order is RCX, RDX, R8, R9. On Unix, the order is RDI, RSI, RDX, RCX, R8, R9. Note that the "r" or "e" at the beginning just indicates whether you are using all 64 bits of the register (r) or only the lower 32 bits (e). So in your case, I would guess that you are using Unix and the correspondence is rdi=key, ecx=size, r8d=compar.
answered Nov 24 '18 at 4:57
Flight OdysseyFlight Odyssey
1,7331218
1,7331218
add a comment |
add a comment |
It depends on the calling convention for the platform you are on. For example the Calling Convention for 64-bit Windows is different than 64-bit Linux (or OSX) code. Looking at the code you provided I can infer you are not targeting Windows and you appear to be using a system that uses the AMD64 System V ABI. You can find a summary of the calling convention and the registers used here .A complete copy can be found here
– Michael Petch
Nov 24 '18 at 4:57
Thanks. I am using OSX.
– dipankar
Nov 24 '18 at 4:59
Yep, OSX uses the AMD64 System V ABI so the links I gave should apply.
– Michael Petch
Nov 24 '18 at 4:59
the linked duplicate covers the normal function calling convention as well as the system-call calling convention.
– Peter Cordes
Nov 24 '18 at 5:13