2016-05-13 7 views
0

Когда я пытаюсь отобразить содержимое регистра с помощью ловушки-задачи 17, я получаю некоторую странную ошибку. Вот мой код:Ошибка Easy 68k при вызове команды 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 

* 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 

Когда я запускаю это, я получаю этот выход: Output

состояние регистров перед вызовом ловушки: Before Trap

Любая помощь будет оценена.

ответ

1

Ваш код ужасно злоупотребляет ловушкой. trap # 15 вызывает операцию, указанную в d0, см. справочное руководство. Вы искали ловушку 15 операции 3,

"Дисплей помеченного числа в D1.L в десятичной системе в наименьшей области (см. Задачу 15 & 20)"

В момент ловушки # 15, называется, ваш Д0 составляет $ 1400, где нижний байт 0x00, который интерпретируется как

«Отображение русских символов строки в (A1), п D1.W (останавливается на NULL или максимум 255) с CR, LF (см. Задачу 13) "

A1 на момент времени равен адресу байта «Продукт».

Он пытается интерпретировать число как строку стиля c и дает вам мусор в результате.

Также имейте в виду, что к тому моменту, когда вы вызываете ловушку, ваши d0 или d1/etc могут быть изменены. ВСЕГДА старайтесь поддерживать назначение d0 как можно ближе к вызову trap, чтобы избежать странных событий. сначала подготовьте свою информацию, затем установите d0, затем вызовите ловушку.

Это, в основном, единственное, что мешает ему работать, но я все-таки переформатировал его так, чтобы мне было удобнее.

;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 
+0

Большое спасибо за помощь человеку – RagCity

 Смежные вопросы

  • Нет связанных вопросов^_^