回答受付終了まであと7日

アセンブリ言語プログラミングについて質問です。 添付画像のようなプログラミングをしたところ、配列外アクセスをしたらしく、コアダンプのエラーメッセージが出ます。 どう改良すればいいのですか。

画像

C言語関連 | プログラミング65閲覧xmlns="http://www.w3.org/2000/svg">500

回答(1件)

>どう改良すれば → (昔のx86と違って)今のx86とても難しいです。 AIに聞いてみました(便利ですね~)。 当方環境でx86アセンブルしたこと無いので動作するか知りません。 頑張ってみて下さい ~~~ [修正コード] ~~~ section .data data:  dd 2, 1, 8, 5, 4, 7, 9, 0, 6, 3 ndata  equ 10 section .text global _start _start:     mov eax, 0              ; 空き     mov ebx, 0              ; i     mov ecx, ndata - 1      ; j     mov edx, 0              ; temp outer_loop:     cmp ebx, ndata - 1     jge endloop     mov ecx, ndata - 1      ; j = ndata - 1 inner_loop:     cmp ecx, ebx + 1     jl next_iteration     mov esi, [data + ecx * 4]      ; esi = data[ecx]     mov edi, [data + ecx * 4 - 4]  ; edi = data[ecx-1]     cmp esi, edi     jge no_swap     ; swap(data[ecx], data[ecx-1])     mov [data + ecx * 4], edi     mov [data + ecx * 4 - 4], esi no_swap:     dec ecx     jmp inner_loop next_iteration:     inc ebx     jmp outer_loop endloop:     mov eax, 1     int 0x80            ;システムコール番号?? return?? ~~~ [cコードに埋込み] ~~~ #include <stdio.h> /* 値を入れ替える関数 */ void swap (int *x, int *y) {     int temp;    // 値を一時保存する変数     temp = *x;     // ここにアセンブリコードを埋め込み     /*     mov eax, [x]     mov edx, [y]     */     *x = *y;     // ここにアセンブリコードを埋め込み     /*     mov [x], edx     */     *y = temp;     // ここにアセンブリコードを埋め込み     /*     mov [y], eax     */ } /* バブルソート */ void bubble_sort (int data[], int data_size) {     int i, j;     for (i = 0; i < data_size - 1; i++) {         // ここにアセンブリコードを埋め込み         /*         mov ebx, i         */         for (j = data_size - 1; j >= i + 1; j--) {   // 右から左に操作             // ここにアセンブリコードを埋め込み             /*             mov ecx, j             */             if (data[j] < data[j-1]) {                 // ここにアセンブリコードを埋め込み                 /*                 mov esi, [data + ecx * 4]      ; esi = data[ecx]                 mov edi, [data + ecx * 4 - 4]  ; edi = data[ecx-1]                 cmp esi, edi                 jl swap                 */                 swap(&data[j], &data[j-1]);                 // ここにアセンブリコードを埋め込み                 /*                 swap:                 mov [data + ecx * 4], edi                 mov [data + ecx * 4 - 4], esi                 */             }         }     }     /*     return  相当     mov eax, 1     int 0x80            ;システムコール番号??     */ } int main (void) {     int data[10] = { 2, 1, 8, 5, 4, 7, 9, 0, 6, 3 };     int i;     printf("Before sort: ");     for (i = 0; i < 10; i++) { printf("%d ", data[i]); }     printf("\n");     bubble_sort(data, 10);     printf("After sort: ");     for (i = 0; i < 10; i++) { printf("%d ", data[i]); }     printf("\n");     return 0; } ━━━━

この回答はいかがでしたか? リアクションしてみよう