Advertisement
Guest User

Untitled

a guest
Oct 29th, 2017
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ; Inndata Programmet leser inn to sifre skilt med ett eller flere mellomrom
  2. ; Utdata Programmet skriver ut summen av de to sifrene,
  3. ; forutsatt at summen er mindre enn 10.
  4.  
  5. ; Konstanter
  6.     cr equ 13 ; Vognretur
  7.     lf equ 10 ; Linjeskift
  8.     SYS_EXIT equ 1
  9.     SYS_READ equ 3
  10.     SYS_WRITE equ 4
  11.     STDIN equ 0
  12.     STDOUT equ 1
  13.     STDERR equ 2
  14.  
  15. ; Datasegment
  16. section .bss
  17.     siffer resb 4
  18.  
  19. ; Datasegment
  20. section .data
  21.     meld db "Skriv to ensifrede tall skilt med mellomrom.",cr,lf
  22.         db "Summen av tallene maa vaere mindre enn 10.",cr,lf
  23.     meldlen equ $ - meld
  24.     feilmeld db cr,lf, "Skriv kun sifre!",cr,lf
  25.     feillen equ $ - feilmeld
  26.     crlf db cr,lf
  27.     crlflen equ $ - crlf
  28.  
  29. ; Kodesegment med program
  30. section .text
  31.  
  32. global _start
  33. _start:
  34.     mov edx,meldlen
  35.     mov ecx,meld
  36.     mov ebx,STDOUT
  37.     mov eax,SYS_WRITE
  38.     int 80h
  39.  
  40.     ; Les tall, innlest tall returneres i ecx
  41.     ; Vellykket retur dersom edx=0
  42.     call lessiffer
  43.     cmp edx,0 ; Test om vellykket innlesning
  44.     jne Slutt ; Hopp tilavslutning ved feil i innlesing
  45.     mov eax,ecx ; Første tall/siffer lagres i reg eax
  46.     call lessiffer
  47.     ; Les andre tall/siffer
  48.     ; vellykket: edx=0, tall i ecx
  49.     cmp edx,0 ;Test om vellykket innlesning
  50.     jne Slutt
  51.     mov ebx,ecx ; andre tall/siffer lagres i reg ebx
  52.  
  53.     call nylinje
  54.     add eax,ebx
  55.     mov ecx,eax
  56.     call skrivsiffer ; Skriv ut verdi i ecx som ensifret tall
  57.  
  58. Slutt:
  59.     mov eax,SYS_EXIT
  60.     mov ebx,0
  61.     int 80h
  62. ; ---------------------------------------------------------
  63.  
  64. skrivsiffer:
  65.     ; Skriver ut sifferet lagret i ecx. Ingen sjekk på verdiområde.
  66.     push eax
  67.     push ebx
  68.     push ecx
  69.     push edx
  70.     add ecx,'0' ; converter tall til ascii.
  71.     mov [siffer],ecx
  72.     mov ecx,siffer
  73.     mov edx,1
  74.     mov ebx,STDOUT
  75.     mov eax,SYS_WRITE
  76.     int 80h
  77.     push edx
  78.     push ecx
  79.     push ebx
  80.     push eax
  81.     ret
  82.  
  83. ; ---------------------------------------------------------
  84. lessiffer:
  85.     ; Leter forbi alle blanke til neste ikke-blank
  86.     ; Neste ikke-blank returneres i ecx
  87.     push eax
  88.     push ebx
  89. Lokke:
  90.     ; Leser et tegn fra tastaturet
  91.     mov eax,SYS_READ
  92.     mov ebx,STDIN
  93.     mov ecx,siffer
  94.     mov edx,1
  95.     int 80h
  96.     mov ecx,[siffer]
  97.     cmp ecx,' '
  98.     je Lokke
  99.     cmp ecx,'0' ; Sjekk at tast er i område 0-9
  100.     jb Feil
  101.     cmp ecx,'9'
  102.     ja Feil
  103.     sub ecx,'0' ; Konverter ascii til tall.
  104.     mov edx,0 ; signaliser vellykket innlesning
  105.     pop ebx
  106.     pop eax
  107.     ret ; Vellykket retur
  108.  
  109. Feil:
  110.     mov edx,feillen
  111.     mov ecx,feilmeld
  112.     mov ebx,STDERR
  113.     mov eax,SYS_WRITE
  114.     int 80h
  115.     mov edx,1 ; Signaliser mislykket innlesning av tall
  116.     pop ebx
  117.     pop eax
  118.     ret ; Mislykket retur
  119. ; ---------------------------------------------------------
  120. ; Flytt cursor helt til venstre på neste linje
  121. nylinje:
  122.     push eax
  123.     push ebx
  124.     push ecx
  125.     push edx
  126.     mov edx,crlflen
  127.     mov ecx,crlf
  128.     mov ebx,STDOUT
  129.     mov eax,SYS_WRITE
  130.     int 80h
  131.     pop edx
  132.     pop ecx
  133.     pop ebx
  134.     pop eax
  135.     ret
  136. ; End _start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement