title: Passing Arguments C -> NASM -> C
body: <p>admittedly this is some homework help, but a specific problem I can't seem to get past.</p>
  
  <p>I'm trying to write a program which takes a string in of hex characters, calls an assembler function which gives me the decimal value of the hex string. That assembler function calls a "checker" function in C which makes sure each character is a legal HEX value.</p>
  
  <p>My question is, how do I take an EBX register in assembler and properly pass it to a C function expecting a character. I can't seem to properly pass from assembler back to C. Am I accidentally passing a pointer here? I also can't seem for the life of me to get an individual character out of EBX even by breaking it up into bytes.</p>
  
  <p>Note, -1 is returned when the character is invalid.</p>
  
  <p>What I'm hoping for:</p>
  
  <p>Please enter a maximal 4 digit hex integer using a string of hex digits: FBE
  You entered: FBE
  FBE - F - 15</p>
  
  <p>What I get:
  Please enter a maximal 4 digit hex integer using a string of hex digits: FBE
  You entered: FBE
  FBE - M - -1</p>
  
  <p>EDIT: The check digit function according to the assignment must only take individual characters. So I will be breaking up the string in the main NASM function for the full functionality. Still trying to get it to work with once character at a time..</p>
  
  <p>C:</p>
  
  <pre><code>#include &lt;stdio.h&gt;
  #include &lt;string.h&gt;
  
  int main(void)
  {  
      char  input[255];
  int   dec_value;
  
  while (1)
  {
      printf ("Please enter a maximal 4 digit hex integer using a string of hex digits: ");
      scanf ("%s",input);
      if (strlen(input) &lt;= 4)
      {
          break;
      }
      printf ("The string is too long!\n");
  }
  
  printf ("You entered: ");
  printf ("%s\n",input);
  extern int hex2dec(char[]);
  dec_value = hex2dec(input);
  printf ("%i",dec_value);
  if (dec_value == -1) {
      printf ("There's an invalid character!\n");
  }
  else {
      printf ("Decimal value of character %s is:%d \n", input, dec_value); 
  }       
  return 0;
  }
  
  int checkdigit (char  hex)
  {
      printf (" - %c - ", hex);
      if ( (hex &lt;= 70 &amp;&amp; hex &gt;= 65) || (hex &gt;= 48 &amp;&amp; hex &lt;= 57) ) {
          if ( hex &gt;= 65 ) {
              printf ("Letter");
              return ( (int) (hex-'A'+10 ));
          }
          else {
              printf ("Number");
              return hex - 48;
          }
      }
      return -1;
  }
  </code></pre>
  
  <p>NASM:</p>
  
  <pre><code>segment .data
  segment .text
  global  hex2dec
  extern  checkdigit, printf
  
  hex2dec:        
      push    EBP
      mov     EBP,ESP
      push    EDX
      push    EBX
  
      mov     EDX,0D         ; 0 EDX
      xor     EBX,EBX
      mov     EBX, DWORD [EBP+8]    ; copy the string to EDX
  
      push    EBX 
  
      call    printf      ; print whole string
      call    checkdigit     ; pass character to interpret
  
      add     ESP,4              ;on return clear the stack,                           
      ;the value is in EAX
      pop     EBX     ;restore EBX        
      pop     EDX     ;restore EDX
      pop     EBP 
      ret
  </code></pre>