0

クライアントが入力する整数の桁数の合計を計算するアセンブリ言語のプログラムに取り組んでいます。番号は常に 10 桁です。私は組み立てに非常に慣れていないため、どのように進めればよいかわかりません。これまでに書いたものは次のとおりです。

        SECTION .data

msg1:   db "Enter a number 10 digits long: "
len1:   equ $-msg1

msg2:   db "The sum of the digits is "
len2:   db $-msg2


        SECTION .bss

num:    resb 10
sum:    resb 3


        SECTION .text
        global _start

_start: nop

start:

        ;prompt for number
        mov     eax, 4
        mov     ebx, 1
        mov     ecx, msg1
        mov     edx, len1
        int     080h

        ;input number
        mov     eax, 3
        mov     ebx, 0
        mov     ecx, num
        mov     edx, 10
        int     080h

init:
        mov     esi, num
        mov     edi, sum

add_digits:

        ;loop 10 times
        ;retrieve next digit
        ;add '0' to convert to number
        ;add to sum

        ;subtract 0 to sum


        ;print results
        mov     eax, 4
        mov     ebx, 1
        mov     ecx, msg2
        mov     edx, len2
        int     080h

        mov     eax, 4
        mov     ebx, 1
        mov     ecx, sum
        mov     edx, 3
        int     080h

        ;exit
exit:
        mov     eax, 1
        mov     ebx, 0
        int     080h        

「add_digits」で疑似コードを実装する方法を知る必要があるだけです。また、上記のコードのいずれかが不十分/間違って書かれている場合はお知らせください。大変感謝しています。

4

3 に答える 3

3

除算 AKAdiv命令を読んで、商と剰余の両方がどのように得られるかを確認してください。次に、数字の桁の取得と 10 による除算の関係について考えてみましょう。

于 2013-02-19T20:08:55.833 に答える
0
  1. sys_read常に改行を返すため、それなしでは返されません。バッファーに 11 バイトを割り当て、edx for に 11 を入れsys_readます。バッファもフラッシュしたいかもしれません...
  2. '0'文字から数値に変換するには減算し、数値から文字に変換するには加算'0'します。あなたのコメントはそれを後回しにしています。
  3. 「仕様」によると、合計が90を超えないことがわかっているため、これは1バイトに収まり、2文字で表すことができます。回避する方法がありdivます...

    ; sum in al...
    aam ; split the byte in al into two digits in al and ah
    add ax, 3030h ; add '0' to both digits
    xchg al, ah  ; swap 'em into right order
    mov [edi], ax ; store both characters in "[sum]"
    mov byte [edi + 2], 10 ; linefeed after printing it?
    

(警告: テストされていないコード!) これは素晴らしく短いですが、変換する数値の範囲が限られています - 「時間」数値に便利です。私はCライブラリ関数でそれを行うことを学び、divおよび/またはCライブラリ関数を使用することを学びますが、私の不安定な記憶が役立つなら、それでうまくいくはずです。

于 2013-02-20T16:06:00.573 に答える
0

数値を 2 進数としてメモリに読み込む場合は、数値から数字を再度抽出する必要があります。つまり、2 進数から 10 進数に変換する必要があります。数値システム間で変換するには、除算 (この場合は 10 で除算) するか、いくつかの特別なアルゴリズムを使用する必要があります。除算を行わずに2進数から 10 進数に変換することもできますが、除算操作をサポートしているアーキテクチャでは除算よりも遅いかもしれません。

最も簡単な方法は、数字を 1 つずつ読み取ってすぐに合計に追加するか、数値全体を文字列として読み取ってから文字を追加することです

于 2013-10-31T01:08:20.377 に答える