How can I pass a Defined quad number (8 BYTES) as a parameters to a subprogram in 32 bit NASM assembly












2















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











share|improve this question




















  • 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
















2















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











share|improve this question




















  • 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














2












2








2


1






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











share|improve this question
















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






share|improve this question















share|improve this question













share|improve this question




share|improve this question








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 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














  • 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








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












1 Answer
1






active

oldest

votes


















0














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






share|improve this answer























    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
    });


    }
    });














    draft saved

    draft discarded


















    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









    0














    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






    share|improve this answer




























      0














      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






      share|improve this answer


























        0












        0








        0







        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






        share|improve this answer













        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







        share|improve this answer












        share|improve this answer



        share|improve this answer










        answered Nov 23 '18 at 22:03









        Peter CordesPeter Cordes

        127k18190326




        127k18190326
































            draft saved

            draft discarded




















































            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.




            draft saved


            draft discarded














            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





















































            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







            Popular posts from this blog

            Wiesbaden

            Marschland

            Dieringhausen