2010-03-22

Berkeley RISC I

RISC төрлийн архитектуртай Berkeley RISC I ассемблэр дээр код бичиж үзлээ.


N EQU 10
DIZI EQU $500

 ORG $500
 DCINT 7
 DCINT -98
 DCINT 5
 DCINT 678
 DCINT -832
 DCINT 4567
 DCINT -789
 DCINT 409
 DCINT -372
 DCINT 65


 ORG $600
START:
 ADD R0,N,R17  
 XOR R16,R16,R16  
 SLL R17,2,R17  
back: 
 LDL (R16)DIZI,R2  
 CALL deltaD(R0),R3 
 NOP
 STL (R16)DIZI,R2  
 ADD R16,4,R16  
 NOP
 SUB R16,R17,R18  
 NOP
 JMP BMI,back(R0) 
 NOP
 NOP

 ORG $700
deltaD: 
 SLL R2,1,R21  
 JMP BMI,neg(R0)  
 NOP
 NOP
 
 SLL R2,2,R2  
 RET (R0)R3
 NOP

neg: 
 SUB R0,R2,R2  
 NOP 
 RET (R0)R3
 NOP


2010-03-07

Моторолла 68000

Эхэн үеийн Макуудад ажилладаг байсан Моторолла 68000 процессерийн ассемблэр хэл дээр програм бичлээ. 16 бит, тэмдэгтгүй тоог анхны тоо эсэхийг шалгадаг програм; яарч хийсэн учир илүү хурдан ажиллууладаг, цөөхөн регистр ашигладаг болгож амжсангүй.
     ORG $0500
num   DC.W  83

     ORG $0600
res   DS.B   1


     ORG  $1000
start MOVEA.L      #$4000,SP

     MOVE.B       #2, (res)
     PEA       num         
     JSR        chkpri     
     MOVE.B   D7, res

     MOVEA.L    #$4000,SP

     MOVE.B #9, D0
     TRAP #15

     ORG  $2000
chkpri MOVE.W  6(A7),A1
     MOVE.W  #2,D3
     MOVE.W  (A1),D4
back  MOVE.L  D4,D2
     DIVU.W  D3,D2
     ADD.W  #1,D3
     CMP.W  D4,D3
     BEQ  pri
     SWAP  D2
     CMPI.W  #0,D2
     BNE  back
     MOVEQ  #0,D7
     RTS
pri   MOVEQ  #1,D7
     RTS


     END  START
chkpri рутиныг ашиглаад массиваас анхны тоонуудыг ялгаж өөр массивт хуулдаг програм:
   ORG $0502
from   DC.W 87,92,7,84,65,32,11,83,103,287
N    DC.W  10

   ORG $0602 
to   DS.W N
  

     
       
   ORG     $1000
 
start   MOVEA.L     #$4000,SP
  
  
   LEA  from,A2 
   LEA  to,A3 
   MOVE.W  N,D5   
   MULU.W  #2,D5   
        
   MOVE.W  #0,D1   
back1   PEA  0(A2,D1.W)  
   ADDI.W  #2,D1   
   JSR  chkpri   
   CMPI.W  #1,D7   
   BEQ  cpypri
   CMP.W  D1,D5   
   BNE  back1
                       LEA  to,A3 
   MOVE.W  D6,(A3)   
   JMP  out   
   
cpypri          ADDI.W  #1,D6   
   ADD.W  #2,A3   
   MOVE.W  D4,(A3)   
   JMP  back1

out

2010-02-17

Linux сервер дээр SVN суулгах

SVN (Subversion) бол багаараа хамтарч төсөл гүйцэтгэхэд тун хэрэгтэй зүйл. Энд тохируулах үйл явцыг бичлээ. Хэрвээ та Debian юмуу Ubuntu хэрэглэж байгаа бол энд хэрэгтэй Apache HTTPd, Subversion зэргийг суулгах нүд эрмэхийн төдий амар зүйл тул суулгах хэсгийг алгасья. Доорх үйл явцад SVN-рүү HTTP протокол ашиглаж холбогдохоор бодож хийе:
# mkdir /subversion
# chown www-data:www-data /subversion
# su www-data
$ svnadmin create /subversion
$ exit
# htpasswd -c /subversion/htpasswd dagvadorj
# htpasswd /subversion/htpasswd oyunjargal
Дараа нь /etc/apache2/httpd.conf файлд дараах мөрүүдийг оруулна:
 <location /svn>
   DAV svn
   SVNPath /subversion
   AuthType Basic
   AuthName "Dagvadorj Subversion Repository"
   AuthUserFile /subversion/htpasswd
   Require valid-user
 </location>

2010-02-12

Spoj-ийн бодлого бодов

spoj.pl сайт ч гоё шүү. Мэдээд удаж байгаа боловч ёр бодлого бодож амжихгүй юмаа. Өнөөдөр ADDREV кодтой бодлогыг бодлоо. Өгөгдсөн тоонуудыг тонгоргож хөрвүүлээд хооронд нь нэмээд, нийлбэрээ бас тонгоргох юм байна. Тоонуудтай бөх барилдаж байгаа юм шиг болчлоо. :D Мартагдах гээд байхаар нь Python-оор бодлоо. Бодолт нь дор байгаа:


def reversify(num):
 p = str(num)
 s = ""
 i = len(p)-1
 while i >= 0:
  s += p[i]
  i = i - 1
 return int(s)

k = raw_input()

h = []

for j in range(int(k)):
 inp = raw_input()
 l = inp.split(" ")
 h.append(l[0])
 h.append(l[1])

u = 0

while u < 2*int(k):
 print reversify(reversify(h[u]) + reversify(h[u+1]))
 u = u + 2

Гэм нь Python-оор бодсон бусад бодолтуудын хажууд жаахан удаан ажилладаг боллоо. Илүү хурданг хийе гэхээр манай хүн унтья, орой болчлоо гээд байхын. Маргааш ажилтай унтья дөө.

2010-01-04

Энэ вэбийг синхрон бишээр авья

2, 3 жийлийн өмнө хүн болгоны магтан ярьж байсан зүйлсийг одоо л би ярих гэж байна даа. Төдий чинээ хоцорч яваа минь энэ биз дээ. Юуг магтаад байсан бэ гэхээр гэдэг технологи. Энэ нь Asynchronous JavaScript and XML гэсэн үгийн товчлол, гэсэн хэдий ч сүүлийн үед бас Ajax гээд товчлол биш шинэ үг маягаар хэрэглэх болсон нь энэ технологийг шүтэн хэрэглэгчдийн анархи биз. Санаа нь вэб хуудас ачааллаж дууссаны хойно бүхэл бүтэн шинэ хуудас ачаалахгүйгээр сервер дэх програмыг ажиллуулан үр дүнг буцааж аван өмнө ачаалласан хуудсанд харуулна гэдэг дээр тогтож байна. Энэ технологийн одууд гэвэл олон байна, жишээ нь: Google Maps, Writely (Google Docs болсон), GMail гээд олон байна. Тухайлбал, Google Maps хиймэл дагуулаас авсан жижгээс томруугаа 13 ширхэг том зураг олон хуваагдсан байгаагийн аль нэг ачаалласан зургийн зөвхөн хэрэглэгчийн фокуст байгаа хэсгийг л ачааллан харуулж, хэрэглэгч хулганаар зургийг чирэхэд зөвхөн шинэ фокус дахь зургуудыг серверээс нэмж ачааллах гэсэн замаар хурдан ажиллаж байна.

Яг тэр 2, 3 жилийн өмнө нь AJAX стандартчилагдаж байхад нь вэбийн стандандартын W3C-гийн сайтруу орж үзэж байгаад XMLHttpRequest обьектийг хэрэглэж үзэж билээ, ид шид юм шиг л санагдаж байсан. Гэхдээ JavaScript дорвитой хэрэглэхээс хальширч байсан учир тэгэсгээд орхисон юм. Учир нь нэг бичсэн код туршиж байсан вэбийн хөтөч програм дээр ажилаад өөр хөтөч дээр ажиллахгүй гэх мэт олон садаа байлаа. Мөн AJAX-д хамгаалалтын асуудлууд байлаа.

За тэгээд л вэб хийхдээ дандаа сервер талтай код бичээд л байлаа. Тэгсэн мөнгө бүхнийг өөрчлөнө гэгчээр санхүүгийн хямралд ороод ирэхээр яахын аргагүй нэгэн бүртгүүлсэн ажлынхаа ажил олгогчид нэг хоногийн дотор AJAX хэрэглэдэг үнэ хаялцах жижигхэн хэрэглээний програм бичиж үзүүлье гээд хэлчихлээ.

Харин энэ үед AJAX вэб хуудас хийх харьцангуй асар болсон байлаа. Ингээд feeditor.com/bidding хэрэглээний програмыг бичлээ. Хэрэглэсэн технологиудын хувьд гэвэл:

  • Java (Java 1.6; Tomcat 5.5)
  • DWR (Direct Web Remoting)
  • MySQL
  • Dojo Toolkit
  • Scriptaculous
  • Prototype

Ингээд кодуудыг (war + build.xml) нь эндээс татаж авч болно шүү. Харин эндээс өгөгдлийн сангийн кодыг авч болно.

Надаар кодуудыг нь тайлбарлуулсан бичлэг бичүүлмээр байвал бичлэгт санал сэтгэгдэлээ бичээрэй.

2009-12-25

Сайн тэсвэр хатуужилтай болмоор юм байна даа

Сүртэй аймар тэсвэр хатуужил бишээ, юмыг өөр зүйлд сатаарахгүй хянамгай уншиж дадах хэрэгтэй юм байна. Саяхан хийсэн хэрэглээний програмыг (feeditor.com) хийхэд хэд хэдэн стандартын бичиг баримт, мөн төчнөөн RFC унших хэрэгтэй боллоо. Зарим нэгнээс нь ойлгож мэдсэнээ тоймлож блогтоо тавихыг бодноо.

Ассемблэр дээр програм бичих

Өчигдөр CodeWarrior татаж авлаа, үнэхээр лаг юмаа хэхэ. Ингээд доор сарыг аваад тухайн сар хэдэн хоногтойг A аккумляторт буцаадаг програс бичлээ. LCD цаг хийсэн лабораторт хэрэг болсон юм л даа. Илүү хурдан ажиллах кодны санаа байвал хуваалцаарай хүмүүсээ.
MY_EXTENDED_RAM: SECTION
YEAR        DS.w 1
MONTH       DS.b 1
DAY         DS.b 1

MyCode:     SECTION
main:
_Startup:
Entry: 
            LDD    #2006
            STD    YEAR
            LDAA   #4
            STAA   MONTH
            LDAA    #5
            STAA   DAY
            JSR   DAYBYMONTH
            SWI

DAYBYMONTH:             ; returns # of days in ACC A
            LDAB   MONTH    
            CMPB   #2      
            BEQ   TSTLEAP  
                       
            CMPB   #8       
            BGE   AUTUMN   
            LDAA   MONTH     
            ASRA 
            BCC     D30
            LDAA    #31      
            RTS
AUTUMN:     
            LDAA   MONTH     
            ASRA 
            BCS     D30
            LDAA    #31
            RTS
D30:        
            LDAA    #30
            RTS
TSTLEAP:
            LDD   YEAR
            LDX   #4
            IDIV
            TBNE   D,NOTLEAP
            LDAA   #29
            RTS
NOTLEAP:
            LDAA   #28
            RTS