わけあってどうしても関数の中で関数を呼び出さなければいけないのですが・・・
aaa関数の中で protect_puts関数を呼び出すようにし
aaa関数をmain関数で呼び出すようにしたいです。
(main関数の中でprotect_putsを直接呼び出す場合はうまく動きます。)
c
1void aaa(void); 2void protect_puts(char *char_address,int bytes,int side_size,int height_size); 3 4 5void main_kernel(){ 6void aaa(); 7} 8 9void aaa(){ 10 char ptr[] = "abcdefghigk"; 11 char *a = ptr; 12 protect_puts(a,11,5,5); 13} 14 15 16 17void protect_puts(char *char_address,int bytes,int side_size,int height_size){ 18 int vram_address = 0xA0000; 19 int font_address = 0x0500; 20 int byte_count = bytes; 21 int yoko = side_size; 22 int tate = height_size; 23 char *ptrr = char_address; 24 25 __asm__ __volatile__( 26 27 "mov %7,%%eax\n\t" 28 "mov %5,%%ebx\n\t" 29 "add %%eax,%%ebx\n\t" 30 "mov %%ebx,%2\n\t" 31 32 33 "mov %8,%%eax\n\t" 34 "mov $1280,%%ebx\n\t" 35 "mul %%ebx\n\t" 36 "mov %5,%%ebx\n\t" 37 "add %%eax,%%ebx\n\t" 38 "mov %%ebx,%2\n\t" 39 40 41 "mov %6,%%eax\n\t" 42 "mov %3,%%ebx\n\t" 43 ".protect_puts_loop2:\n\t" 44 "cmp $0,%%ebx\n\t" 45 "jz .endd\n\t" 46 47 "xor %%esi,%%esi\n\t" 48 "mov (%%eax),%%esi\n\t" 49 "and $0b00000000000000000000000011111111,%%esi\n\t" 50 "shl $4,%%esi\n\t" 51 52 "xor %%ebx,%%ebx\n\t" 53 "mov %4,%%ebx\n\t" 54 "add %%ebx,%%esi\n\t" 55 56 57 "mov %5,%%edi\n\t" 58 59 "mov $16,%%ecx\n\t" /* 1文字 縦16bitだから */ 60 61 ".protect_puts_loop:\n\t" 62 "movsb\n\t" 63 "add $80 - 1,%%edi\n\t" 64 "loop .protect_puts_loop\n\t" 65 66 "inc %%eax\n\t" 67 68 "xor %%ebx,%%ebx\n\t" 69 70 "mov %5,%%ebx\n\t" 71 "add $1,%%ebx\n\t" 72 "mov %%ebx,%2\n\t" 73 74 "mov %3,%%ebx\n\t" 75 "sub $1,%%ebx\n\t" 76 "mov %%ebx,%0\n\t" 77 "mov %3,%%ebx\n\t" 78 79 "jmp .protect_puts_loop2\n\t" 80 81 82 ".endd:\n\t" 83 84 85 : "=m" (byte_count), 86 "=m" (font_address), 87 "=m" (vram_address) 88 89 : "m" (byte_count), 90 "m" (font_address), 91 "m" (vram_address), 92 "m" (ptrr), 93 "m" (yoko), 94 "m" (tate) 95 ); 96 97 } 98
protect_putsを単体で呼び出したときは
画面に abcdefghijkが正常に表示されますが
c
1void main_kernel(){ 2 char ptr[] = "abcdefghigk"; 3 char *a = ptr; 4 protect_puts(a,11,5,5); 5}
aaa関数の中でprotect_putsを呼び出すようにし、
aaa関数を呼び出しましたが
なにも表示されません。
c
1#include <stdio.h> 2 3 void test_sample(void); 4 5void main(void){ 6 test_sample(); 7} 8 9void test_sample(void){ 10printf("%d",5); 11} 12
こちらで一応試しましたが関数の中で関数は呼び出せますよね?
うまく動かない原因として何があるのでしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/20 09:13