私は、このアルゴリズムを使用して入力文字列内で最小の単語を検索するプログラムを作成しようとしています。TASMの文字列を変更
マイアルゴリズム:
Read character from input, but not echo
If character is space:
current_string_length = 0;
current_string = "";
echo character
Else If character belong to English alphabet:
current_string_length++;
current_string += character;
if current_string_length < max_string_length:
max_string = current_string;
max_string_length = current_length_string;
echo character
Else If character is "\n":
print max_string
しかし、私は、アセンブリ内の新たなんだと文字列ときれいな文字列に文字を追加する方法を見つけることができません。どのように私はこれを行うことができますか、多分私はこのタスクのための別のアルゴリズムを選択する必要がありますか?
マイコード:
.model small
.stack 100h ; reserves 100h bytes for stack
.data
;----------------------------------------------------------------------------------
; Variables
maxString db 128 dup('$')
currentString db 128 dup('$')
maxLength dw 0
currentLength dw 0
;----------------------------------------------------------------------------------
; Messages
helloMessage db 10,13,'Assembly Shortest Word Finder Version 1.0 Copyright (c) 2016 RodionSoft',10,13,10,13,'Usage: enter string with length of words not more then 128 characters',10,13,10,13,10,13,10,13,'Enter string: $'
resultMessage db 10,13,"Shortest word: $"
;----------------------------------------------------------------------------------
; Program
.code
start :
MOV AX, @data
MOV DS, AX
;----------------------------------------------------------------------------------
; Print helloMessage
lea dx, helloMessage ; LEA - Load Affective Address
mov ah, 9 ; print the string of the adress
int 21h ; present in DX register
;----------------------------------------------------------------------------------
; main loop
repeat:
; -------------------------------------------------------------------------
; Read character but not echo
mov ah, 08h
int 21h
mov ah, 0 ; ah = 0
cmp al, 13h ; if(al == enter)
jz printResult ; printResult()
cmp al, 20h ; if(al == enter)
jz spaceinput ; spaceInput()
; -------------------------------------------------------------------------
cmp al, 41h ; if(al < 'A')
jl badInput ; badInput()
cmp al, 7Ah ; if(al > 'z')
jg badInput ; badInput()
cmp al, 5Bh ; if(al < '[')
jg goodInput ; goodInput()
cmp al, 60h ; if(al > '`')
jg goodInput ; goodInput()
jmp badInput ; else badInput()
goodInput:
inc currentString
; currentString += al
badInput:
jmp repeat
spaceInput:
mov currentLength, 0
;clean currentString
endOfIteration:
mov ah, 2 ; echo
int 21h
jmp repeat ; loop
;----------------------------------------------------------------------------------
printResult:
lea dx, secondMessage
mov ah, 9
int 21h
lea dx, maxString
mov ah, 9
int 21h
;----------------------------------------------------------------------------------
exit:
MOV AX, 4c00h
INT 21h
StringComparison proc
push cx dx bx ax bp si di ; save general-purpose registers
mov cx, maxLength ; cx = maxLength
mov dx, currentLength ; dx = currentLength
cmp cx, dx ; if(currentLength > maxLength)
jl currentBigger ; currentBigger()
jmp return ; else return
currentBigger:
; maxString = currentString
return:
pop di si bp ax bx dx cx ; restore general-purpose registers
ret
endp
end start
そのアルゴリズムはいろいろな点で私にはかなり間違っています...ループ本体とし、すべての値を初期化して、私がa、b、_、c、\ nを入力するとしましょう。アルゴリズムは、a、b、_、c、aを出力します。 (これはおそらく\ nを表示すると良いでしょうし、最短の文字列は "a"ではなく "c"です)...だから、まずこのタスクのアルゴリズムを修正し、いくつかの修正がどのように見えるかを考慮する必要があります。それを変更するのにはかなり近いですが、文字列の追加とクリアのためではありません。 – Ped7g
アルゴリズムをCのように書くのではなく、1つの抽象度を上げてみてください。つまり、 "私は最短の単語を見つける" - > "found = none、単語の入力を解析し、 found = word " - > ....より簡単なステップに分割し、さまざまな入力で時々検証しても問題ありません。 ( "ab c \ n"と "a bc \ n"のような共通点だけでなく、 "\ n"や "\ n"のようなトリッキーなものも考慮してください) – Ped7g
ありがとう、私はこのアルゴリズムをリファクタリングしようとします。文字列に文字を追加したり、アセンブリ言語で現在の単語を含む変数をクリーンアップするようにしますか? – Rodion