How can I pass a Defined quad number (8 BYTES) as a parameters to a subprogram in 32 bit NASM assembly
I am using 32-bit NASM assembly and was wondering if there is a way to pass a defined quad number (8bytes) as a parameter to a subprogram in Nasm 32-bit assembly. I know that the stack in 32bit assembly is organized to accept defined double words (4 bytes). So I am wondering if this is even possible to do.
Example code:
section .data
x: dq 10 ;Defining x as a 8 byte number
section .bss
section .text
global asm_main
asm_main:
enter 0,0 ;Creating stack frame
push QWORD[x] ;pushing x as a parameter for the test subprogram
call test ;Calling the subprogram
add esp,8 ;Deallocating memory used by parameter
leave
ret
But when I run the code I get an error saying that (push QWORD[x])
:
instruction not supported in 32-bit mode
assembly stack parameter-passing nasm 32bit-64bit
add a comment |
I am using 32-bit NASM assembly and was wondering if there is a way to pass a defined quad number (8bytes) as a parameter to a subprogram in Nasm 32-bit assembly. I know that the stack in 32bit assembly is organized to accept defined double words (4 bytes). So I am wondering if this is even possible to do.
Example code:
section .data
x: dq 10 ;Defining x as a 8 byte number
section .bss
section .text
global asm_main
asm_main:
enter 0,0 ;Creating stack frame
push QWORD[x] ;pushing x as a parameter for the test subprogram
call test ;Calling the subprogram
add esp,8 ;Deallocating memory used by parameter
leave
ret
But when I run the code I get an error saying that (push QWORD[x])
:
instruction not supported in 32-bit mode
assembly stack parameter-passing nasm 32bit-64bit
2
push each dword separately, or copy it via an XMM register withmovq
load/store.
– Peter Cordes
Nov 23 '18 at 21:55
Can you elaborate on how to push each dword separately
– John
Nov 23 '18 at 21:59
@John A QWORD can be seen as two DWORDs. So first push the high DWORD and then the low one.
– fuz
Nov 23 '18 at 22:02
add a comment |
I am using 32-bit NASM assembly and was wondering if there is a way to pass a defined quad number (8bytes) as a parameter to a subprogram in Nasm 32-bit assembly. I know that the stack in 32bit assembly is organized to accept defined double words (4 bytes). So I am wondering if this is even possible to do.
Example code:
section .data
x: dq 10 ;Defining x as a 8 byte number
section .bss
section .text
global asm_main
asm_main:
enter 0,0 ;Creating stack frame
push QWORD[x] ;pushing x as a parameter for the test subprogram
call test ;Calling the subprogram
add esp,8 ;Deallocating memory used by parameter
leave
ret
But when I run the code I get an error saying that (push QWORD[x])
:
instruction not supported in 32-bit mode
assembly stack parameter-passing nasm 32bit-64bit
I am using 32-bit NASM assembly and was wondering if there is a way to pass a defined quad number (8bytes) as a parameter to a subprogram in Nasm 32-bit assembly. I know that the stack in 32bit assembly is organized to accept defined double words (4 bytes). So I am wondering if this is even possible to do.
Example code:
section .data
x: dq 10 ;Defining x as a 8 byte number
section .bss
section .text
global asm_main
asm_main:
enter 0,0 ;Creating stack frame
push QWORD[x] ;pushing x as a parameter for the test subprogram
call test ;Calling the subprogram
add esp,8 ;Deallocating memory used by parameter
leave
ret
But when I run the code I get an error saying that (push QWORD[x])
:
instruction not supported in 32-bit mode
assembly stack parameter-passing nasm 32bit-64bit
assembly stack parameter-passing nasm 32bit-64bit
edited Nov 23 '18 at 21:58
zx485
14.5k133047
14.5k133047
asked Nov 23 '18 at 21:53
JohnJohn
132
132
2
push each dword separately, or copy it via an XMM register withmovq
load/store.
– Peter Cordes
Nov 23 '18 at 21:55
Can you elaborate on how to push each dword separately
– John
Nov 23 '18 at 21:59
@John A QWORD can be seen as two DWORDs. So first push the high DWORD and then the low one.
– fuz
Nov 23 '18 at 22:02
add a comment |
2
push each dword separately, or copy it via an XMM register withmovq
load/store.
– Peter Cordes
Nov 23 '18 at 21:55
Can you elaborate on how to push each dword separately
– John
Nov 23 '18 at 21:59
@John A QWORD can be seen as two DWORDs. So first push the high DWORD and then the low one.
– fuz
Nov 23 '18 at 22:02
2
2
push each dword separately, or copy it via an XMM register with
movq
load/store.– Peter Cordes
Nov 23 '18 at 21:55
push each dword separately, or copy it via an XMM register with
movq
load/store.– Peter Cordes
Nov 23 '18 at 21:55
Can you elaborate on how to push each dword separately
– John
Nov 23 '18 at 21:59
Can you elaborate on how to push each dword separately
– John
Nov 23 '18 at 21:59
@John A QWORD can be seen as two DWORDs. So first push the high DWORD and then the low one.
– fuz
Nov 23 '18 at 22:02
@John A QWORD can be seen as two DWORDs. So first push the high DWORD and then the low one.
– fuz
Nov 23 '18 at 22:02
add a comment |
1 Answer
1
active
oldest
votes
One way is to push each dword separately
push dword [x+4] ; high half first
push dword [x] ; then low half
Or you can do a 64-bit copy via an XMM register with movq
load/store. x87 fild
/ fistp
is probably not worth using, but movq
is if SSE2 is available.
BTW, avoid the enter
instruction. It's very slow. Use push ebp
/ mov ebp,esp
like compilers do. (And for the record, you could have answered your own question by looking at compiler output for a function that calls another function, like void foo(int64_t *p) { bar(*p); }
. https://godbolt.org/z/0rUx-M
add a comment |
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53453299%2fhow-can-i-pass-a-defined-quad-number-8-bytes-as-a-parameters-to-a-subprogram-i%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
1 Answer
1
active
oldest
votes
1 Answer
1
active
oldest
votes
active
oldest
votes
active
oldest
votes
One way is to push each dword separately
push dword [x+4] ; high half first
push dword [x] ; then low half
Or you can do a 64-bit copy via an XMM register with movq
load/store. x87 fild
/ fistp
is probably not worth using, but movq
is if SSE2 is available.
BTW, avoid the enter
instruction. It's very slow. Use push ebp
/ mov ebp,esp
like compilers do. (And for the record, you could have answered your own question by looking at compiler output for a function that calls another function, like void foo(int64_t *p) { bar(*p); }
. https://godbolt.org/z/0rUx-M
add a comment |
One way is to push each dword separately
push dword [x+4] ; high half first
push dword [x] ; then low half
Or you can do a 64-bit copy via an XMM register with movq
load/store. x87 fild
/ fistp
is probably not worth using, but movq
is if SSE2 is available.
BTW, avoid the enter
instruction. It's very slow. Use push ebp
/ mov ebp,esp
like compilers do. (And for the record, you could have answered your own question by looking at compiler output for a function that calls another function, like void foo(int64_t *p) { bar(*p); }
. https://godbolt.org/z/0rUx-M
add a comment |
One way is to push each dword separately
push dword [x+4] ; high half first
push dword [x] ; then low half
Or you can do a 64-bit copy via an XMM register with movq
load/store. x87 fild
/ fistp
is probably not worth using, but movq
is if SSE2 is available.
BTW, avoid the enter
instruction. It's very slow. Use push ebp
/ mov ebp,esp
like compilers do. (And for the record, you could have answered your own question by looking at compiler output for a function that calls another function, like void foo(int64_t *p) { bar(*p); }
. https://godbolt.org/z/0rUx-M
One way is to push each dword separately
push dword [x+4] ; high half first
push dword [x] ; then low half
Or you can do a 64-bit copy via an XMM register with movq
load/store. x87 fild
/ fistp
is probably not worth using, but movq
is if SSE2 is available.
BTW, avoid the enter
instruction. It's very slow. Use push ebp
/ mov ebp,esp
like compilers do. (And for the record, you could have answered your own question by looking at compiler output for a function that calls another function, like void foo(int64_t *p) { bar(*p); }
. https://godbolt.org/z/0rUx-M
answered Nov 23 '18 at 22:03
Peter CordesPeter Cordes
127k18190326
127k18190326
add a comment |
add a comment |
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53453299%2fhow-can-i-pass-a-defined-quad-number-8-bytes-as-a-parameters-to-a-subprogram-i%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
push each dword separately, or copy it via an XMM register with
movq
load/store.– Peter Cordes
Nov 23 '18 at 21:55
Can you elaborate on how to push each dword separately
– John
Nov 23 '18 at 21:59
@John A QWORD can be seen as two DWORDs. So first push the high DWORD and then the low one.
– fuz
Nov 23 '18 at 22:02