>どう改良すれば
→
(昔の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;
}
━━━━