質問編集履歴

4

追記

2020/04/17 21:09

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -739,3 +739,87 @@
739
739
  ```
740
740
 
741
741
  引数の右からスタックに積まれています。
742
+
743
+
744
+
745
+ ```c
746
+
747
+ #ifndef __SET_MACRO_VA_FUNCTION
748
+
749
+
750
+
751
+ #define __SET_MACRO_VA_FUNCTION
752
+
753
+ #define va_list2 void*
754
+
755
+ #define va_start2(void_p,argument) ((void_p)= &(argument) + sizeof(argument))
756
+
757
+ #define va_arg2(void_p,type) *((type*)(void_p+=sizeof(type)) - sizeof(type))
758
+
759
+ #define va_end2(void_p) ((ap) = (void_p)0)
760
+
761
+
762
+
763
+ #endif
764
+
765
+
766
+
767
+ void main(void){
768
+
769
+ function(1,2,3,4,5);
770
+
771
+ }
772
+
773
+
774
+
775
+ void function(int a,...){
776
+
777
+ va_list2 void_p;
778
+
779
+ va_start2(void_p,a);
780
+
781
+ printf("%p\n",void_p);
782
+
783
+ va_arg2(void_p,int); //aの次
784
+
785
+ printf("%p\n",void_p);
786
+
787
+
788
+
789
+ }
790
+
791
+
792
+
793
+ //
794
+
795
+ //
796
+
797
+ //==低位アドレス==
798
+
799
+ //
800
+
801
+ //a
802
+
803
+ //b
804
+
805
+ //c
806
+
807
+ //d
808
+
809
+ //e
810
+
811
+ //
812
+
813
+ // ===高位アドレス==
814
+
815
+ //
816
+
817
+ //
818
+
819
+
820
+
821
+ ```
822
+
823
+ 0061FF10
824
+
825
+ 0061FF14

3

追記

2020/04/17 21:09

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -617,3 +617,125 @@
617
617
  もしかしたらどこかで初歩的なミスをしているのかもしれません
618
618
 
619
619
  分からないので教えてください。
620
+
621
+
622
+
623
+ **追記**
624
+
625
+ ```c
626
+
627
+ void main_kernel(void){
628
+
629
+ function(1,2,3,4,5);
630
+
631
+ }
632
+
633
+
634
+
635
+ void function(int a,...){
636
+
637
+
638
+
639
+ }
640
+
641
+
642
+
643
+ ```
644
+
645
+
646
+
647
+ ```s
648
+
649
+ .file "sample6.c"
650
+
651
+ .text
652
+
653
+ .globl _main_kernel
654
+
655
+ .def _main_kernel; .scl 2; .type 32; .endef
656
+
657
+ _main_kernel:
658
+
659
+ LFB0:
660
+
661
+ .cfi_startproc
662
+
663
+ pushl %ebp
664
+
665
+ .cfi_def_cfa_offset 8
666
+
667
+ .cfi_offset 5, -8
668
+
669
+ movl %esp, %ebp
670
+
671
+ .cfi_def_cfa_register 5
672
+
673
+ subl $40, %esp
674
+
675
+ movl $5, 16(%esp)
676
+
677
+ movl $4, 12(%esp)
678
+
679
+ movl $3, 8(%esp)
680
+
681
+ movl $2, 4(%esp)
682
+
683
+ movl $1, (%esp)
684
+
685
+ call _function
686
+
687
+ nop
688
+
689
+ leave
690
+
691
+ .cfi_restore 5
692
+
693
+ .cfi_def_cfa 4, 4
694
+
695
+ ret
696
+
697
+ .cfi_endproc
698
+
699
+ LFE0:
700
+
701
+ .globl _function
702
+
703
+ .def _function; .scl 2; .type 32; .endef
704
+
705
+ _function:
706
+
707
+ LFB1:
708
+
709
+ .cfi_startproc
710
+
711
+ pushl %ebp
712
+
713
+ .cfi_def_cfa_offset 8
714
+
715
+ .cfi_offset 5, -8
716
+
717
+ movl %esp, %ebp
718
+
719
+ .cfi_def_cfa_register 5
720
+
721
+ nop
722
+
723
+ popl %ebp
724
+
725
+ .cfi_restore 5
726
+
727
+ .cfi_def_cfa 4, 4
728
+
729
+ ret
730
+
731
+ .cfi_endproc
732
+
733
+ LFE1:
734
+
735
+ .ident "GCC: (MinGW.org GCC-8.2.0-3) 8.2.0"
736
+
737
+
738
+
739
+ ```
740
+
741
+ 引数の右からスタックに積まれています。

2

訂正

2020/04/17 20:33

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
File without changes
test CHANGED
@@ -606,7 +606,9 @@
606
606
 
607
607
  64bitは引数をスタックだけではなくレジスタも使うはずですよね?
608
608
 
609
- 今回はたまたま引数引き渡しにレジスタが使われなかった
609
+ 今回はたまたま引数引き渡しにレジスタが使われなかったから
610
+
611
+ うまく動作した・・・?
610
612
 
611
613
 
612
614
 

1

訂正

2020/04/17 09:28

投稿

kazuyakazuya
kazuyakazuya

スコア193

test CHANGED
@@ -1 +1 @@
1
- 32bit環境でsprintf関数を使い 自作OS
1
+ 32bit環境でsprintf関数を使いたい 自作OS
test CHANGED
File without changes