0

トラップ タスク 17 を使用してレジスタの内容を表示しようとすると、奇妙なエラーが発生します。これが私のコードです:

*Equates section
program_start equ $1000   *Start Location of program
timesToAdd    equ 10     *Number to multiply numToMultiply by
numToMultiply equ 512    *Number to multiply through cumulative sum

ORG    program_start
START:                  ; first instruction of program

* Put program code here
    MOVE.L  #$00000000,D0  *Initially set value in D0 to 0
    MOVE.B  #timesToAdd,D2  *Store times left to add in D2

loop    CMP.B    #0,D2         *Check if we are finished adding
        BEQ  loop_end          *exit loop if we are done
        SUB.B #1,D2            *decrement timesToAdd by 1
        ADDI.L #numToMultiply,D0 *Add numToMultiply to value in D0
        BCC skipSet
        MOVE.B #1,D1           *Set D1 to 1 if carry bit is set 
skipSet BRA loop
loop_end     
     MOVE.L D0,D2
     MOVE.L #17,D0

     CMP.B #0,D1    *Check if there was a carry
     BEQ skipCarry
     LEA Carry,A1
     Trap #15       *Print Carry: with carry bit
skipCarry
     MOVE.L D2,D1
     LEA Product,A1
     Trap #15

     SIMHALT             ; halt simulator

Carry DC.B 'Carry: '
Product DC.B 'Product= '
    END    START        ; last line of source

これを実行すると、次の出力が得られます

トラップ呼び出し前のレジスタの状態: トラップ前

どんな助けでも大歓迎です。

4

1 に答える 1

1

あなたのコードはトラップをひどく悪用しています。トラップ #15 は、d0 で示される操作を呼び出します。ヘルプ マニュアルを参照してください。トラップ 15 オペレーション 3 を探していましたが、

「D1.L の符号付き数値を最小フィールドに 10 進数で表示します。(タスク 15 & 20 を参照)」

トラップ #15 が呼び出された時点で、D0 は $1400 で、下位バイトは 0x00 であり、次のように解釈されます。

「(A1) に n 文字の文字列を表示します。n は D1.W (NULL または最大 255 で停止) で、CR、LF を使用します (タスク 13 を参照)」

このときの A1 はバイト「Product」のアドレスと同じです。

数値を ac スタイルの文字列として解釈しようとしているため、結果としてゴミが発生します。

また、trap を呼び出すまでに、d0 または d1/etc が変更されている可能性があることに注意してください。奇妙なことが起こらないように、常に d0 割り当てをトラップ呼び出しの近くに保つようにしてください。最初に情報を準備し、次に d0 を設定してから、trap を呼び出します。

それがほとんどの場合、動作を妨げている唯一のことですが、とにかく、より快適な方法で再フォーマットしました。

;Equates section
program_start equ $1000       ; Start Location of program
timesToAdd    equ 10          ; Number to multiply numToMultiply by
numToMultiply equ 512         ; Number to multiply through cumulative sum

    org    program_start
start:                        ; first instruction of program
    move.l  #$00000000,  D0   ; Initially set value in D0 to 0
    move.b  #timesToAdd, D2   ; Store times left to add in D2

loop:   
    cmp.b  #0, d2             ; Check if we are finished adding
    beq    loop_end           ; exit loop if we are done
    sub.b  #1, d2             ; decrement timesToAdd by 1
    addi.l #numToMultiply, d0 ; Add numToMultiply to value in D0
    bcc    skipSet
    move.b #1, d1             ; Set D1 to 1 if carry bit is set 

skipSet:
    bra loop

loop_end:
    ; Check if there was a carry
    cmp.b #0, d1    
    beq   skipCarry
    lea   Carry, a1

    ; Print Carry: with carry bit
    move.l #17, d0
    move.l d0,  d2
    trap   #15       

skipCarry:
    move.l d2, d1
    lea Product, a1

    move.l d0, d1
    move.l #3, d0
    trap #15

    simhalt

Carry   dc.b 'Carry: '
Product dc.b 'Product= '
    end start
于 2016-05-13T23:27:38.580 に答える