私はアセンブリ言語 (TASM 86x) の初心者で、最初のプログラムの割り当てに取り組んでいます。本質的に複雑ではありませんが、この言語に慣れていないので、単純なバブルソートを理解するのに苦労しています。
これまでのところ、魔女の C++ しかプログラムしていません。全体的に最も難しい部分は、構文を把握することです。
タスクは、(ユーザーが入力した) 任意の文字列を取得し、ASCII 値で昇順で再配置することです (たとえば、beda と入力すると、abde が返されます)。
出力については確信が持てませんが、並べ替えが完了した後に表示されるはずです。文字列を入力してコマンドプロンプトを終了するだけなので、混乱しています。時期尚早にコードの終わりを指しているという間違いを犯した場所を追跡できません。
より経験豊富な人が私のコードを見て、正しい方向に向けてくれたり、初心者に何かを説明してくれたりすると、とても感謝しています。
.model small
.stack 100h
.data
request db 'Enter symbols:', 0Dh, 0Ah, '$'
buffer db 100, ?, 100 dup (0)
.code
start:
MOV ax, @data
MOV ds, ax
; request
MOV ah, 09h
MOV dx, offset request
int 21h
; read string ;reading string to buffer
MOV dx, offset buffer
MOV ah, 0Ah
INT 21h
MOV si, offset buffer
INC si ;going from buffer size to actual length
;of the string
MOV cl, [si] ;string length - loop counter
mov ch, [si] ;string length - loop counter
mov bl, [si] ;bl will be used to reset inner loop counter
DEC cl ;correcting the values, since count goes
dec ch ; from 0 to n-1 instead of 1 to n
inc si ;moving to strings first byte
outer: ;outer loop
dec ch ;decrease counter each pass
jz ending ;when counter reaches 0 end program
mov cl, bl ; reset inner loop counter value
inner: ;inner loop
mov al,byte ptr[si] ;assigning byte(sybol) to al
mov ah, byte ptr[si+1] ;assigning following byte(symbol) to ah
cmp al,ah ;compare the two
jle after_switch ;if the latter's value is higher, no need to switch
スイッチに問題があり、組み立てで正しく機能するかどうかわからない
mov bh, al ;main problem-switching values, tried a few different
mov al, ah ;ways of doing it (will show them below), but to no avail
mov ah, bh ;using familiar C syntax
jmp output ;outputing the value
after_switch: ;no switch needed
外側のスイッチのどこかに出力へのジャンプがあるはずですが、残りのシーケンスを台無しにすることなくそれを含める方法がわかりません
inc [si] ;going to the next byte
dec cl ;decreasing inner loop counter
jnz inner ;back to the beginning of inner loop until counter reaches 0 (resetting in the outer loop)
jmp outer ;if counter reaches zero, get back to outer
output: ;outputting value from the very first bit
mov ah, 2
mov dl, al ;which after switch is supposed to be stored in al
int 21h
jmp inner ;returning to inner loop to run next course of comparison
ending:
MOV ax, 4c00h
INT 21h
end start
内側のループで以前に試した switch の方法
mov al,[si+1]
mov byte ptr[si+1],[si]
mov byte ptr[si], al
不正なメモリ参照エラーを返しますが、この質問は過去にこのボードで既に回答されていることがわかりました。
同じ方法を試しましたが、dx:di レジスターを利用しました
mov al, byte ptr[si+1]
mov dx:[di], [si]
mov byte ptr[si+1], dx:[di]
mov byte ptr[si], al
無効なオーバーライド レジスタ エラーを返します。何も見つかりませんでした