Advertisement
Eternoseeker

ASS 5

May 24th, 2023
139
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
ASM (NASM) 5.65 KB | Source Code | 0 0
  1. ;-------------------------------------------------------------------
  2. section    .data
  3.         nline        db        10,10
  4.         nline_len        equ        $-nline
  5.         colon                db        ":"
  6.  
  7.  
  8.         rmsg         db         10,'Processor is in Real Mode...'
  9.         rmsg_len        equ         $-rmsg
  10.  
  11.  
  12.         pmsg         db         10,'Processor is in Protected Mode...'
  13.         pmsg_len        equ         $-pmsg
  14.  
  15.  
  16.         gmsg                db        10,"GDTR (Global Descriptor Table Register)        : "
  17.         gmsg_len        equ        $-gmsg
  18.  
  19.  
  20.         imsg                db        10,"IDTR (Interrupt Descriptor Table Register)        : "
  21.         imsg_len        equ        $-imsg
  22.  
  23.  
  24.         lmsg                db        10,"LDTR (Local Descriptor Table Register)        : "
  25.         lmsg_len        equ        $-lmsg
  26.  
  27.  
  28.         tmsg                db        10,"TR (Task Register)                : "
  29.         tmsg_len        equ        $-tmsg
  30.  
  31.  
  32.         mmsg                db        10,"MSW (Machine Status Word)        : "
  33.         mmsg_len        equ        $-mmsg
  34. ;---------------------------------------------------------------------
  35. Section   .bss
  36.         GDTR                resw        3                ; 48 bits, so 3 words
  37.         IDTR                resw        3
  38.         LDTR                resw        1                ; 16 bits, so 1 word
  39.         TR                resw        1
  40.         MSW                resw        1
  41.  
  42.  
  43.         char_ans        resb        4                ; 16-bits, so 4 digits
  44. ;---------------------------------------------------------------------
  45. %macro  Print   2
  46.         mov   rax, 1
  47.         mov   rdi, 1
  48.         mov   rsi, %1
  49.         mov   rdx, %2
  50.         syscall
  51. %endmacro
  52.  
  53.  
  54. %macro  Read   2
  55.         mov   rax, 0
  56.         mov   rdi, 0
  57.         mov   rsi, %1
  58.         mov   rdx, %2
  59.         syscall
  60. %endmacro
  61.  
  62.  
  63. %macro        Exit        0
  64.         mov  rax, 60
  65.         mov  rdi, 0
  66.         syscall
  67. %endmacro
  68.  
  69.  
  70. ;---------------------------------------------------------------------
  71.  
  72.  
  73. section    .text
  74.         global   _start
  75. _start:
  76.  
  77.  
  78.         SMSW                [MSW]
  79.  
  80.  
  81.         mov                rax,[MSW]
  82.         ror                 rax,1                        ; Check PE bit, if 1=Protected Mode, else Real Mode
  83.         jc                 p_mode
  84.  
  85.  
  86.         Print        rmsg,rmsg_len
  87.         jmp                next
  88.  
  89.  
  90. p_mode:        
  91.         Print        pmsg,pmsg_len
  92.  
  93.  
  94. next:
  95.         SGDT                [GDTR]
  96.         SIDT                [IDTR]
  97.         SLDT                [LDTR]
  98.         STR                [TR]
  99.         SMSW                [MSW]
  100.  
  101.  
  102.         Print        gmsg, gmsg_len                ;GDTR (Global Descriptor Table Register)
  103.                                                         ; LITTLE ENDIAN SO TAKE LAST WORD FIRST
  104.         mov                 ax,[GDTR+4]                ; load value of GDTR[4,5] in ax
  105.         call         disp16_proc                ; display GDTR contents
  106.         mov                 ax,[GDTR+2]                ; load value of GDTR[2,3] in ax
  107.         call         disp16_proc                ; display GDTR contents
  108.         Print        colon,1
  109.         mov                 ax,[GDTR+0]                ; load value of GDTR[0,1] in ax
  110.         call         disp16_proc                ; display GDTR contents
  111.  
  112.  
  113.         Print        imsg, imsg_len                ;IDTR (Interrupt Descriptor Table Register)
  114.         mov                 ax,[IDTR+4]                
  115.         call         disp16_proc                
  116.         mov                 ax,[IDTR+2]                
  117.         call         disp16_proc                
  118.         Print        colon,1
  119.         mov                 ax,[IDTR+0]                
  120.         call         disp16_proc                                
  121.  
  122.  
  123.         Print        lmsg, lmsg_len                ;LDTR (Local Descriptor Table Register)
  124.         mov                 ax,[LDTR]                
  125.         call         disp16_proc                
  126.  
  127.  
  128.         Print        tmsg, tmsg_len                ;TR (Task Register)        
  129.         mov                 ax,[TR]                
  130.         call         disp16_proc                
  131.  
  132.  
  133.         Print        mmsg, mmsg_len                ;MSW (Machine Status Word)        
  134.         mov                 ax,[MSW]                
  135.         call         disp16_proc                
  136.  
  137.  
  138.         Print        nline, nline_len
  139.         Exit
  140. ;--------------------------------------------------------------------        
  141. disp16_proc:
  142.         mov                 rbx,16                        ; divisor=16 for hex
  143.         mov                 rcx,4                        ; number of digits
  144.         mov                 rsi,char_ans+3                ; load last byte address of char_ans buffer in rsi
  145.  
  146.  
  147. cnt:        mov                 rdx,0                        ; make rdx=0 (as in div instruction rdx:rax/rbx)
  148.         div                 rbx
  149.  
  150.  
  151.         cmp                 dl, 09h                        ; check for remainder in rdx
  152.         jbe          add30
  153.         add          dl, 07h
  154. add30:
  155.         add                 dl,30h                        ; calculate ASCII code
  156.         mov                 [rsi],dl                        ; store it in buffer
  157.         dec                 rsi                                ; point to one byte back
  158.  
  159.  
  160.         dec                 rcx                                ; decrement count
  161.         jnz                 cnt                                ; if not zero repeat
  162.        
  163.         Print         char_ans,4                ; display result on screen
  164. ret
  165. ;----------------------------------------------------------------
  166.  
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement