質問編集履歴
4
追記
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
追記
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
訂正
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
訂正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
32bit環境でsprintf関数を使い
|
1
|
+
32bit環境でsprintf関数を使いたい 自作OS
|
test
CHANGED
File without changes
|