Advertisement
Guest User

Untitled

a guest
Nov 22nd, 2018
94
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. .386
  2. .model flat, stdcall
  3.  
  4. include msvcrt.inc
  5. includelib msvcrt.lib
  6. include kernel32.inc
  7. includelib kernel32.lib
  8. include masm32.inc
  9. includelib masm32.lib
  10.  
  11. PutCh macro chr:VARARG
  12.   FOR arg, <chr>
  13.      mov byte ptr CHR, arg
  14.      INVOKE StdOut, ADDR CHR
  15.   ENDM
  16. ENDM
  17.  
  18. _strcat Proto C dest:DWORD, src1:DWORD, src2:DWORD
  19.  
  20. .data
  21.     CHR   db 0,0
  22.     sir   db "\tp\tr\ti\tn\tt\tf\t \tt\te\ts\tt\t: sir1=""%s"", sir2=""%s""\nnr1=%h, nr2=%d, long=%li,\nchar='%c', pointer=%p", 0
  23.     psir1 db "bla",0
  24.     psir2 db "bla bla",0
  25.     int1  dw 10000
  26.     int2  dw -5555
  27.     long  dd -1234567
  28.     chr   db '*'
  29.    
  30.     abc db "ABCD",0
  31.     efg db "LMNO",0
  32.     alphabet db "asdfasgdgafgasg",0
  33.    
  34. .code
  35.     start:                                          
  36.        
  37.         ;push offset sir     ; 4
  38.         ;movzx ax, chr
  39.         ;push ax             ; 2
  40.         ;push long           ; 4
  41.         ;push word ptr int2  ; 2
  42.         ;push word ptr int1  ; 2
  43.         ;push offset psir2  ; 4
  44.         ;push offset psir1   ; 4
  45.         ;push offset sir     ; 4
  46.         ;call _printf
  47.         ;add esp, 26
  48.        
  49.         invoke _strcat, addr alphabet, addr abc, addr efg
  50.        
  51.         push offset alphabet
  52.         call _printf
  53.         add esp, 4
  54.        
  55.         call crt__getch
  56.     exit:
  57.         invoke ExitProcess, 0                 ; invoke ExitProcess API
  58.  
  59. _strcat Proc C uses ebx ecx edx dest:DWORD, src1:DWORD, src2:DWORD
  60.    
  61.     mov ebx, src1
  62.     mov ecx, src2
  63.     mov edx, dest
  64.    
  65.     sir1:
  66.    
  67.     mov al, BYTE ptr [ebx]
  68.     cmp al, 0
  69.     je sir2
  70.     mov BYTE ptr [edx], al
  71.    
  72.     inc ebx
  73.     inc edx
  74.    
  75.     jmp sir1
  76.    
  77.     sir2:
  78.    
  79.     xor ebx, ebx
  80.    
  81.     sir2_loop:
  82.    
  83.     mov al, BYTE ptr [ecx]
  84.     mov BYTE ptr [edx], al
  85.     cmp al, 0
  86.    
  87.     je done
  88.    
  89.     inc ecx
  90.     inc edx
  91.    
  92.     jmp sir2_loop
  93.    
  94.     done:
  95.     ret
  96. _strcat EndP
  97.  
  98.  
  99. _printf Proc
  100.     push ebp
  101.     mov  ebp, esp
  102.     push esi
  103.     push edi      
  104.     mov  edi, 12
  105.     mov  esi, [ebp+8]                   ; ESI pointer la sir formatat
  106.     dec  esi
  107.   printf_loop:
  108.     inc  esi
  109.     mov  al, [esi]
  110.     test al, al
  111.     je printf_done
  112.     cmp  al, '%'
  113.     jne  printf_char
  114.     inc  esi
  115.     mov  al, [esi]
  116.     cmp  al, 's'
  117.     je   printf_param_str
  118.     cmp  al, 'd'
  119.     je   printf_param_int
  120.     cmp  al, 'i'
  121.     je   printf_param_int
  122.     cmp  al, 'u'
  123.     je   printf_param_uint
  124.     cmp  al, 'h'
  125.     je   printf_param_hex
  126.     cmp  al, 'p'
  127.     je   printf_param_ptr
  128.     cmp  al, 'c'
  129.     je   printf_param_char
  130.     cmp  al, '%'
  131.     je   printf_normal_char
  132.     cmp  al, 'l'
  133.     jne  printf_loop
  134.     inc  esi
  135.     mov  al, [esi]
  136.     cmp  al, 'd'
  137.     je   printf_param_long_int
  138.     cmp  al, 'i'
  139.     je   printf_param_long_int
  140.     cmp  al, 'u'
  141.     je   printf_param_long_uint
  142.     cmp  al, 'h'
  143.     je   printf_param_long_hex      
  144.     jmp  printf_loop
  145.   printf_char:
  146.     cmp al, '\'
  147.     jne printf_normal_char
  148.     inc esi
  149.     mov al, [esi]
  150.     cmp al, 'n'
  151.     je  printf_crlf
  152.     cmp al, 't'
  153.     je printf_tab
  154.     cmp al, '\'
  155.     jne printf_loop
  156.   printf_normal_char:  
  157.     PutCh al
  158.     jmp  printf_loop
  159.   printf_param_str:
  160.     push dword ptr [ebp+edi]
  161.     call crt__cputs
  162.     add  esp, 4
  163.     add  edi, 4
  164.     jmp  printf_loop
  165.   printf_param_int:
  166.     movsx eax, word ptr [ebp+edi]
  167.     push eax                            ; parametru PutI
  168.     call _PutI                          ; Apel PutI "CDECL"
  169.     add  esp, 4                         ; refacere stiva
  170.     add  edi, 2                         ; doar 2 octeti pe stiva
  171.     jmp printf_loop
  172.   printf_param_uint:
  173.     movzx eax, word ptr [ebp+edi]
  174.     push eax                            ; parametru PutI
  175.     call _PutU                          ; Apel PutU "CDECL"
  176.     add  esp, 4                         ; refacere stiva
  177.     add  edi, 2                         ; doar 2 octeti pe stiva
  178.     jmp printf_loop
  179.   printf_param_hex:
  180.     PutCh '0', 'x'
  181.     movzx eax, word ptr [ebp+edi]
  182.     push eax                            ; parametru PutI
  183.     call _PutH                          ; Apel PutU "CDECL"
  184.     add  esp, 4                         ; refacere stiva
  185.     add  edi, 2
  186.     jmp printf_loop
  187.  printf_param_char:
  188.     mov al, byte ptr [ebp+edi]          ; citesc caracterul de pe stiva
  189.     PutCh al                            ; Afisez
  190.     add  edi, 2                         ; Eliberez stiva (2 octeti)
  191.     jmp printf_loop
  192.  printf_param_long_int:
  193.     pushd [ebp+edi]
  194.     call _PutI
  195.     add  esp, 4                         ; refacere stiva parametru PutI
  196.     add  edi, 4                         ; 4 octeti pe stiva
  197.     jmp printf_loop
  198.   printf_param_long_uint:
  199.     pushd [ebp+edi]
  200.     call _PutU
  201.     add  esp, 4                         ; refacere stiva parametru PutI
  202.     add  edi, 4                         ; 4 octeti pe stiva
  203.     jmp printf_loop
  204.   printf_param_long_hex:
  205.     PutCh '0', 'x'
  206.     pushd [ebp+edi]
  207.     call _PutH
  208.     add  esp, 4                         ; refacere stiva parametru PutI
  209.     add  edi, 4                         ; 4 octeti pe stiva
  210.     jmp printf_loop
  211.   printf_param_ptr:
  212.     pushd [ebp+edi]
  213.     call _PutH
  214.     add  esp, 4                         ; refacere stiva parametru PutI
  215.     add  edi, 4                         ; 4 octeti pe stiva
  216.     jmp printf_loop
  217.   printf_crlf:
  218.     PutCh 10,13
  219.     jmp printf_loop
  220.   printf_tab:
  221.     .data
  222.         spatii db "        ",0
  223.     .code
  224.         invoke StdOut, addr spatii
  225.     jmp printf_loop
  226.   printf_done:
  227.     pop  edi
  228.     pop  esi
  229.     pop  ebp
  230.     Ret
  231. _printf EndP
  232.  
  233. _PutU proc                  ; parametri: numarfara semn
  234.     push ebp                ; salvare EBP
  235.     mov  ebp, esp           ; Copiere ESP in EBP pentru acesarea param
  236.     push edx                ; salvare registri utilizati
  237.     push ebx
  238.          
  239.     mov  eax, [ebp+8]       ; EAX <- parametru din stiva
  240.     xor  edx, edx           ; edx = 0
  241.     mov  ebx, 10
  242.     div  ebx                ; EDX:EAX / baza  (EAX=cat, EDX = rest)
  243.    
  244.     test eax, eax           ; EAX == 0 (conditia de iesire)
  245.     je PutU_Done
  246.    
  247.     push edx                ; EDX (rest) -> stiva
  248.    
  249.     push eax                ; push catul (param 1)
  250.     call _PutU              ; apel recursiv
  251.     add  esp, 4
  252.    
  253.     pop  edx                ; EDX <- stiva
  254.   PutU_Done:
  255.     add  dl, '0'            ; conversie cifra din DL in caracter ASCII
  256.    
  257.     PutCh dl               
  258.    
  259.     pop  ebx                ; refacere registri utilizati
  260.     pop  edx
  261.     pop  ebp
  262.     Ret
  263. _PutU EndP
  264.  
  265. _PutH proc                  ; parametri: numarfara semn
  266.     push ebp                ; salvare EBP
  267.     mov  ebp, esp           ; Copiere ESP in EBP pentru acesarea param
  268.     push edx                ; salvare registri utilizati
  269.     push ebx
  270.          
  271.     mov  eax, [ebp+8]       ; EAX <- parametru din stiva
  272.     xor  edx, edx           ; edx = 0
  273.     mov  ebx, 16
  274.     div  ebx                ; EDX:EAX / baza  (EAX=cat, EDX = rest)
  275.    
  276.     test eax, eax           ; EAX == 0 (conditia de iesire)
  277.     je PutH_Done
  278.    
  279.     push edx                ; EDX (rest) -> stiva
  280.    
  281.     push eax                ; push catul (param 1)
  282.     call _PutH              ; apel recursiv
  283.     add  esp, 4
  284.    
  285.     pop  edx                ; EDX <- stiva
  286.   PutH_Done:
  287.     cmp  dl, 10             ; compar cifra cu 10
  288.     jb  PutH_Cifra09        ; daca este mai mica = cifra zecimala (0-9)
  289.     add  dl, ('A'-10)-'0' ;
  290.   PutH_Cifra09:
  291.     add  dl, '0'            ; conversie cifra din DL in caracter ASCII
  292.    
  293.     PutCh dl                ; refacere stiva
  294.    
  295.     pop  ebx                ; refacere registri utilizati
  296.     pop  edx
  297.     pop  ebp
  298.     Ret
  299. _PutH EndP
  300.  
  301. _PutI proc                  ; parametri: numar cu semn
  302.     push ebp                ; salvare EBP
  303.     mov  ebp, esp           ; Copiere ESP in EBP pentru acesarea param
  304.          
  305.     mov  eax, [ebp+8]       ; EAX <- parametru din stiva
  306.     cmp  eax, 0
  307.     jge  PutI_Pozitiv       ; salt daca param 1 este pozitiv
  308.    
  309.     PutCh '-'               ; afisare '-'    
  310.     mov  eax, [ebp+8]       ; reincarc EAX (midificat de afisare '-')
  311.     neg  eax                ; inversez semnul (EAX devine pozitiv)
  312.    
  313.    PutI_Pozitiv:     
  314.    
  315.     push eax
  316.     call _PutU
  317.     add  esp, 4
  318.  
  319.     pop  ebp
  320.     Ret                 ; 2 pararametri DWORD pe stiva
  321. _PutI EndP
  322.  
  323. end start
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement