Advertisement
IAbstract

read and parse txt file

Apr 20th, 2015
266
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. ;   David Boarman
  2.  
  3. SECTION .data       ; initialized data
  4.     SEEK_SET    dd  0;
  5.     SEEK_CUR    dd  1;
  6.     SEEK_END    dd  2;
  7.    
  8.     endl:       db  10, 0
  9.     char:       db  "%d: %s", 10, 0
  10.     mfnf:       db  "file not found", 0
  11.     mske:       db  "seek could not be completed", 0
  12.    
  13.     fname:      db  "d:\asmplus\tsources\s1.txt", 0
  14.     fread:      db  "r", 0
  15.    
  16.     mclf:       db  "close", 0
  17.     mopf:       db  "open", 0
  18.     mrdf:       db  "read", 0
  19.     mskf:       db  "seek", 0
  20.     mszf:       db  "size", 0
  21.    
  22.     mcld:       db  "[FILE] call [%s]: %d", 10, 0
  23.     mcls:       db  "[FILE] call [%s]: %s", 10, 0
  24.     merr:       db  "[FILE] error [%s]: %s", 10, 0
  25.     mret:       db  "[FILE] ret [%s]: %d", 10, 0
  26.     mrts:       db  "[FILE] ret [%s]:", 10, "%s", 10, 0
  27.    
  28. SECTION .text       ; code
  29.     extern _fclose
  30.     extern _fopen
  31.     extern _fread
  32.     extern _free
  33.     extern _fseek
  34.     extern _ftell
  35.     extern _malloc
  36.     extern _printf
  37.     extern _puts
  38.    
  39.     global _main
  40.    
  41.     _main:
  42.         ;   stash base stack pointer
  43.         push    ebp
  44.         mov     ebp,    esp
  45.        
  46.         push    DWORD   fname
  47.         push    DWORD   mopf
  48.         push    DWORD   mcls
  49.         call    _printf
  50.         add     esp,    12          ; clean up stack use
  51.                
  52.         ;   open file
  53.         push    DWORD   fread
  54.         push    DWORD   fname
  55.         call    _fopen
  56.         add     esp,    8
  57.        
  58.         cmp     eax,    0
  59.         jnz     .valid
  60.        
  61.         push    DWORD   mfnf
  62.         push    DWORD   mopf
  63.         jmp     .error
  64.        
  65.         .valid:
  66.         mov     [fh],   eax
  67.        
  68.         ;   output result
  69.         push    DWORD   [fh]
  70.         push    DWORD   mopf
  71.         push    DWORD   mret
  72.         call    _printf
  73.         add     esp,    12
  74.        
  75.         push    DWORD   [fh]
  76.         push    DWORD   mskf
  77.         push    DWORD   mcld
  78.         call    _printf
  79.         add     esp,    12
  80.        
  81.         ;   C:
  82.         ;   fseek(fp, 0L, SEEK_END);    ; set up constants: SEEK_END, SEEK_SET, etc.
  83.         push    DWORD   [SEEK_END]
  84.         push    DWORD   0               ; 0L
  85.         push    DWORD   [fh]            ; f_hndl
  86.         call    _fseek                  ; ret [eax]: 0 okay; otherwise 1
  87.         add     esp,    12              ; reset stack pointer
  88.        
  89.         cmp     eax,    0
  90.         je      .success
  91.        
  92.         push    DWORD   mske
  93.         push    DWORD   mskf
  94.         jmp     .error
  95.        
  96.         .success:
  97.         ;   output result
  98.         push    DWORD   eax
  99.         push    DWORD   mskf
  100.         push    DWORD   mret
  101.         call    _printf
  102.         add     esp,    12
  103.        
  104.         ;   C:
  105.         ;   sz = ftell(fp);             ; result to eax
  106.         push    DWORD   [fh]
  107.         call    _ftell
  108.         add     esp,    4
  109.        
  110.         mov     [fsz],  eax
  111.        
  112.         ;   output result
  113.         push    DWORD   [fsz]
  114.         push    DWORD   mszf
  115.         push    DWORD   mcld
  116.         call    _printf
  117.         add     esp,    12
  118.        
  119.         ;   seek back to the beginning of the file
  120.         push    DWORD   [SEEK_SET]
  121.         push    DWORD   0               ; 0L
  122.         push    DWORD   [fh]            ; f_hndl
  123.         call    _fseek                  ; ret [eax]: 0 okay; otherwise 1
  124.         add     esp,    12              ; reset stack pointer
  125.                
  126.         ;   allocate buffer
  127.         ;   C:
  128.         ;   p* = malloc(size)
  129.         push    DWORD   [fsz]
  130.         call    _malloc
  131.         add     esp,    4
  132.        
  133.         mov     [buffer],    eax
  134.        
  135.         ;   read file
  136.         ;   size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream)        
  137.         push    DWORD   [fh]
  138.         push    DWORD   [fsz]
  139.         push    DWORD   1
  140.         push    DWORD   [buffer]
  141.         call    _fread
  142.         add     esp,    16
  143.        
  144.         push    DWORD   [fsz]
  145.         push    DWORD   mrdf
  146.         push    DWORD   mcld
  147.         call    _printf
  148.         add     esp,    12
  149.        
  150.         push    DWORD   [buffer]
  151.         push    DWORD   fname
  152.         push    DWORD   mrts
  153.         call    _printf
  154.         push    DWORD   endl
  155.         call    _printf
  156.         add     esp,    16
  157.        
  158.         ;   loop contents and separate on spaces
  159.         mov     ecx,    0
  160.         mov     ebx,    buffer
  161.         .readByte:
  162.             push    DWORD   [ebx + 1 * ecx]
  163.             push    DWORD   ecx
  164.             push    DWORD   char
  165.             call    _printf
  166.             add     esp,        12
  167.            
  168.             incr    ecx
  169.            
  170.             cmp     ecx,        [fsz]
  171.             jge     .endRead
  172.            
  173.             jmp     .readByte
  174.                
  175.         .endRead:
  176.         push    DWORD   endl
  177.         call    _printf
  178.         add     esp,    4
  179.        
  180.         jmp     .done
  181.        
  182.         .error:
  183.         push    DWORD   merr
  184.         call    _printf
  185.         add     esp,    12
  186.        
  187.         .done:
  188.         push    DWORD   [fh]
  189.         call    _fclose
  190.        
  191.         push    DWORD   [buffer]
  192.         call    _free
  193.        
  194.         push    DWORD   eax
  195.         push    DWORD   mclf
  196.         push    DWORD   mcld
  197.         call    _printf
  198.         add     esp,    16
  199.        
  200.         ;   restore base stack pointer
  201.         mov     esp,    ebp
  202.         pop     ebp
  203.        
  204.         ret
  205.        
  206. SECTION .bss        ; uninitialized data
  207.     fh:     resd    1
  208.     fsz:    resd    1
  209.     buffer: resd    1
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement