1. ホーム
  2. arrays

[解決済み】アセンブリ言語での配列のバブルソート

2022-02-03 11:46:03

質問

7つの整数からなる未整理の配列を、9,6,5,4,3,2,1 のようにバブルソートする必要があります。
私のコードをコンパイラーにかけたところ、次のように表示されました。

このコードのどこが問題なのか理解できません。

code segment
assume ds:code,cs:code
start:
 mov ax,code
 mov ds,ax    ;code start
ARR:   dw 1,2,4,3,6,5,9
 mov ch,0h
 mov cl,1h
 mov bh 7h
 jmp assign_nums
restart:
 mov ch,0h
 mov cl,1h
 dec bh
 jmp assign_nums
swap:
 mov ch,dl
 mov cl,dh
 jmp next
next:
 cmp bh,cl
 je restart
 add ch,1h
 add cl,1h
 jmp assign_nums
assign_nums:
 cmp bh,0h
 je done
 mov dh,[ARR+ch]
 mov dl,[ARR+cl]
 cmp dh,dl
 jl swap
 jnl next
done:
 nop
code ends
end start

解決方法は?

1つ目のエラーは、registerとimmediateの間にコンマを入力するのを忘れています。

2番目と3番目のエラーは、CHとCLレジスタはメモリのアドレッシングに使用できません。代わりにSI,DI,BXを使用してください。

配列はワードで定義されているので、ワードとして扱わなければなりません。
変更

mov dh,[ARR+ch]
mov dl,[ARR+cl]

を次のようなものに変更します (他の選択にもよりますが)。

mov ax,[ARR+si]
mov dx,[ARR+di]

配列が命令の中に入っていることに注意してください。これではコンパイルしたとたんにプログラムがクラッシュしてしまいます。配列はプログラムの別のデータセグメントに置くか、この行を飛び越えてください。

start:
 mov ax,code
 mov ds,ax
 jmp start2
ARR:   dw 1,2,4,3,6,5,9
start2:
 mov ch,0h