2016-07-07 34 views
0

ich habe einen Code hier:Grund Assemblersprache Get & Systemzeit anzeigen

org 100h 

mov ah, 2ch 
int 21h 

mov ah, 2 
mov dl, ch 
int 21h 

mov ah, 2 
mov dl, cl 
int 21h  

ret 

und was ich will, ist die Systemzeit angezeigt werden soll. Aber es zeigt stattdessen andere Zeichen an. Wie repariere ich das?

EDIT: Wie kann ich hier eine Division hinzufügen? Ich denke, was ich will, ist um 10 ch und cl zu teilen und es individuell

Dank für Antworten

+0

Die Anweisung [AAM] (http://www.felixcloutier.com/x86/AAM.html) wäre in diesem Fall eine Alternative zu div. –

Antwort

3

Stunden von 0 bis 23
Minuten von 0 bis 59.

Sie sind zwei reichen drucken Ziffern Zahlen und als solche behandelt werden müssen.

Es gibt keinen integrierten Service, der druckt Zahlen, die Int 21/AH=02h druckt Zeichen, benötigen Sie eine zweistellige Zahl (eine 8-Bit-Größe) in eine two characters (zwei 8-Bit-Mengen) zu transformieren.

Diese Seite hat viele Beispiele, hier ist eine, die nur einfache Anweisungen verwenden.

ORG 100h 

mov ah, 2ch   ;Get time 
int 21h 

mov dl, ch   ;Show hours 
call itoa99 

mov ah, 02h   ;Show separator 
mov dl, ':' 
int 21h 

mov dl, cl   ;Show minutes 
call itoa99  

mov ax, 4c00h   ;Exit 
int 21h 



;dl = number to display (0..99) 
itoa99: 
push bx 
push ax   ;Save registers used 

xor ax, ax   ;AX = 0 
mov al, dl   ;AX = DL 

mov bl, 10d 
div bl    ;AL = AX/10, AH = AX mod 10 

;AX contains the digits 

add ax, 3030h  ;Transform digit to digitals 

;ASCII digits starts at 30h, digit X is the char 30h+X 

;ASCII value: 30h 31h 32h 33h ... 39h 
;Character: 0 1 2 3 ... 9 



mov bx, ax   ;Save for later 

;Show the digits 
mov dl, bl 
mov ah, 02h 
int 21h 

mov dl, bh 
int 21h 

pop ax 
pop bx 
ret 

zweistellige Nummer hat ... zwei Ziffern.
Basis 10 ist ein Positionssystem, dh die Zahlendarstellung besteht aus gewichteten Mengen, die als Ziffern bezeichnet werden.
Jede Ziffer ist selbst eine Zahl, aber einfach genug, um ein eindeutiges Symbol zugeordnet zu haben, eine digitale.
Zum Beispiel wird die Ziffer 4 mit unterschiedlichen Symbolen dargestellt, abhängig von der Kultur: ‚4‘, ‚ד‘, ‚四‘, ‚IV‘ ‚4‘, ...
eine Zahl zur Basis anzuzeigen 10, müssen wir zuerst die Ziffern extrahieren und dann die Ziffern in ihre Digitals konvertieren. Das Endergebnis ist eine Ziffer.
Um die zwei 10-stelligen Ziffern einer 0-59-Bereichsnummer zu extrahieren, verwenden wir einfach: d0 = n mod 10, d1 = n/10.
Überzeugen Sie sich selbst, dass dies in der Tat das richtige Ergebnis gibt und dass jeder di zwischen 0 und 9

+0

Zwei kleine Bemerkungen: (a) Stunden reichen von 0 bis __23__ und (b) Unerfahrene Benutzer können nicht sofort begreifen, dass sie Hexadezimalzahlen verwenden müssen, wenn Sie nicht das richtige Präfix/Suffix in "Int 21/AH = 02" schreiben – Fifoernik

+0

@Fifoernik Danke, was für dumme Fehler! :) Das 'Int 21/AH = 02' sollte' Int 21/AH = 02h' sein. Es ist [Ralf Brown] (http://www.ctyme.com/intr/rb-2554.htm) -Nomenklatur, also werde ich kein * h * nach dem * 21 * hinzufügen. –

+0

o ... k ... ich habe das Programm kopiert und eingefügt. Aber ich verstehe es immer noch nicht. Tut mir leid, dass ich ein Noob bin.Unser Lehrer hat uns nur die Codes gelehrt, die ich oben benutzt habe, und wir benutzen nicht Push, Xor und viele dieser Dinge. Danke für die Antworten, ich schätze es. – Marviuz

0

Dieser Code für Sie vielleicht hilfreich. Sie können es hier finden und auch herunterladen: Timer Tick Example of Assembly Language

[org 0x0100] 

    jmp start 


incTime: dw 0 
hrs: dw 0 
min: dw 0 
sec: dw 0 

clearScreen: 

    push ax 
    push di 
    push es 

    mov ax , 0xB800 
    mov es , ax 
    mov di , 0 
    nextCls: 
     mov word [es:di] , 0x0720 
     add di , 2 
     cmp di , 4000 
     jne nextCls 

    pop es 
    pop di 
    pop ax 
    ret 


printTime: 

    push bp 
    mov bp , sp 
    push ax 
    push bx 
    push cx 
    push dx 
    push si 
    push di 
    push es 

    call clearScreen 

    mov si , 0 ;counter to use 3 prints i.e. Hrs, Min, Sec 
    mov ax , 0xB800 
    mov es , ax 
    mov di , 142 

nextState: 

    mov bx , bp 
    sub bx , si 
    add bx , 8 
    mov ax , [bx] ;BX=BP-SI+8 
    mov bx , 10 
    mov cx , 0 

    nextDigit: 
     mov dx , 0 
     div bx 
     add dl , 0x30 
     push dx 
     inc cx 
     cmp ax , 0 
     jnz nextDigit 

    nextPos: 
     pop dx 
     mov dh , 0x07 
     mov [es:di] , dx 
     add di , 2 
     loop nextPos 

     add si , 2 
     cmp si , 6 
     jz return 

     mov dl , ':' 
     mov [es:di] , dx 
     add di , 2 
     jmp nextState 


    return: 
     pop es 
     pop di 
     pop si 
     pop dx 
     pop cx 
     pop bx 
     pop ax 
     pop bp 

     ret 6 

Clock: 
    push ax 

    inc word [cs:incTime] 
    cmp word [cs:incTime] , 18 
    jz Reset 

    proceedToCall: 
     push word [cs:hrs] 
     push word [cs:min] 
     push word [cs:sec] 
     call printTime 

     mov al , 0x20 
     out 0x20 , al 

     pop ax 
     iret 

    Reset: 
     mov word [cs:incTime] , 0 
     inc word [cs:sec] 
     cmp word [cs:sec] , 60 
     jnz proceedToCall 
     mov word [cs:sec] , 0 
     inc word [cs:min] 
     cmp word [cs:min] , 60 
     jnz proceedToCall 
     mov word [cs:min] , 0 
     inc word [cs:hrs] 
     cmp word [cs:hrs] , 24 
     jnz proceedToCall 
     mov word [cs:hrs] , 0 
     jmp proceedToCall 


start: 
    xor ax , ax 
    mov es , ax 
    cli 
     mov word [es:8*4] , Clock 
     mov word [es:8*4+2] , cs 
    sti 

    mov dx , start 
    add dx , 15 
    mov cl , 4 
    shr dx , cl 

    mov ax , 0x3100 
    int 0x21 
+0

Obwohl dieser Code kann dazu beitragen, das Problem zu lösen, bietet zusätzlichen Kontext in Bezug auf _Why_ und/oder _HOW_ es Antworten die Frage würde erheblich verbessern seine langfristige Wert. Bitte [bearbeiten] Sie Ihre Antwort, um eine Erklärung hinzuzufügen. –

0

habe ich es!

org 100h 

mov ah, 2ch ;get time 
int 21h  ; 

mov hour, ch 
mov mins, cl 

mov ah, 0  ; 
mov al, hour ;divide by 10 
mov bl, 10 ; 
div bl  ; 

mov hour1, al 
mov hour2, ah 

mov ah, 2  ; 
mov dl, hour1 ; 
add dl, 30h ; 
int 21h  ; 
       ;print hour 
mov ah, 2  ; 
mov dl, hour2 ; 
add dl, 30h ; 
int 21h  ; 

mov ah, 2  
mov dl, ':' 
int 21h  

mov ah, 0  ; 
mov al, mins ;divide by 10 
mov bl, 10 ; 
div bl  ; 

mov min1, al 
mov min2, ah 

mov ah, 2  ; 
mov dl, min1 ; 
add dl, 30h ; 
int 21h  ; 
       ;print minuntes 
mov ah, 2  ; 
mov dl, min2 ; 
add dl, 30h ; 
int 21h  ; 

ret 

hour db ? ; 
mins db ? ; 
hour1 db ? ; 
hour2 db ? ;initialize variables 
min1 db ? ; 
min2 db ? ;