2016-07-07 2 views
0

У меня есть код здесь:Базовый язык ассемблера Получить и система отображения времени

org 100h 

mov ah, 2ch 
int 21h 

mov ah, 2 
mov dl, ch 
int 21h 

mov ah, 2 
mov dl, cl 
int 21h  

ret 

и то, что я хочу, чтобы отобразить системное время. Но вместо этого отображаются другие символы. Как это исправить?

EDIT: Как я могу добавить операцию разделения здесь? я думаю, что я хочу, чтобы разделить ч и сл на 10 и распечатать его индивидуально

спасибо за ответы

+0

Инструкция [AAM] (http://www.felixcloutier.com/x86/AAM.html) была бы альтернативой div в этом случае. –

ответ

3

часов в диапазоне от 0 до 23.
минут от 0 до 59.

Они являются два цифры цифр и как таковые должны быть обработаны.

Там нет встроенной службы, печатает числа, то Int 21/AH=02h печатает символы, вам нужно преобразовать число две цифры (8-битное количество) в two characters (два 8 битовых величин) .

На этом сайте представлено множество примеров, здесь приведены только простые инструкции.

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 

Число двух цифр имеет ... две цифры.
База 10 представляет собой позиционную систему, это означает, что числовое представление состоит из взвешенных величин, называемых цифрами.
Каждая цифра сама по себе является номером, но достаточно проста, чтобы иметь уникальный символ, связанный, цифровой.
Например, цифра 4 представлена ​​различными символами в зависимости от культуры: '4', 'ד', '四', 'IV', '4', ...
Чтобы отобразить число в базе 10, нам сначала нужно извлечь цифры, а затем преобразовать цифры в свои цифровые. Конечным результатом является цифра.
Для извлечения двух базовых 10 цифр номера диапазона 0-59 мы просто используем: d0 = n mod 10, d1 = n/10.
Убедить вашей собственной личности, что это действительно дает правильный результат и что каждый di между 0 и 9.

+0

Два небольших замечания: (a) Диапазон часов от 0 до __23__ и (b) Неопытные пользователи не могут мгновенно понять, что им нужно использовать шестнадцатеричные символы, если вы не введете правильный префикс/суффикс в 'Int 21/AH = 02' – Fifoernik

+0

@Fifoernik Спасибо, какие глупые ошибки! :) 'Int 21/AH = 02' должен быть' Int 21/AH = 02h'. Это [Ralf Brown] (http://www.ctyme.com/intr/rb-2554.htm) номенклатура, поэтому я не буду добавлять * h * после * 21 *. –

+0

o ... k ... i скопировал и вставил программу. Но я все еще не понимаю. Извините за нобе.наш инструктор только учил нас кодам, которые я использовал выше, и мы не используем push, xor и многие из этих вещей. спасибо за ответы, которые я ценю. – Marviuz

0

Этот код может быть полезным для вас. Вы можете найти его здесь и скачать также: 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

Хотя этот код может помочь решить проблему, предоставив дополнительный контекст относительно _why_ и/или _how_ он отвечает вопрос значительно улучшит его долгосрочное значение . Пожалуйста, отредактируйте свой ответ, чтобы добавить какое-то объяснение. –

0

я получил его!

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 ? ; 
Смежные вопросы