Sign in to follow this  
fiveworlds

Visual Studio C _asm int arrays

Recommended Posts

fiveworlds    68

Does anybody know how to use int arrays in the inline assembly compiler for c? I tried just putting the line[index] in but that gives me a "\n" access error.

 

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int i;
int line[38];
int repeatedNumbers[38];
int input;
int loopcount;
const LAST_LINE_DATABASE = "lastline.txt";

int main(int argc, char **argv)
{
 filed();

 _getch();
 exit(EXIT_SUCCESS);
}
int filed() {
 // We assume argv[1] is a filename to open
 FILE *file = fopen("lastline.txt", "rb");
 
 if (file == 0)
 {
  printf("Could not open file\n");
  file = fopen(LAST_LINE_DATABASE, "wb");
  for (i = 0; i < 38; i = i + 1) {line[i] = 1;}
  input = rand() % 36;
  repeatedNumbers[0] = input;
  line[input + 1] = 0;

  fwrite(line, sizeof(int), 38, file);
  return 1;
 }
 else
 {
  printf("File opened\n");
  fread(line, sizeof(int), 38, file);
  for (i = 0; i < 38; i = i + 1) {
   printf("%d", line[i]);
  }
  
  fclose(file);
  return 0;
 }
}

 

Share this post


Link to post
Share on other sites
Sensei    618
Posted (edited)

Your example does not want to compile on my Visual Studio Express,

 

I had to add two lines:

const char *LAST_LINE_DATABASE = "lastline.txt";

int filed();

Did you read MSDN entire section about inline assembly.. ?

https://msdn.microsoft.com/en-us/library/4ks26t93.aspx

That should be for a start.

 

Here

https://msdn.microsoft.com/en-us/library/bf1dw62z(v=vs.140).aspx

they're showing code:

__asm mov array[6], bx ;  Store BX at array+6 (not scaled) 

__asm mov array[6 * TYPE int], 0 ; Store 0 at array + 24

But it's always constant index,

in your case it's variable.. ?

In old times, around '80-'90, we were used to take variable (address of structure/array) to one register, then take another variable to other register, multiply it by size of structure/array entry, and add together to get final address.

 

final_addr = addr+size*index

Edited by Sensei

Share this post


Link to post
Share on other sites
fiveworlds    68

Ah I was missing the type. It should be a variable yeah which should be helpful if I can get it working right.

#include<stdio.h>
#include<conio.h>
#include<stdlib.h>
int i;
int k;
int line[38];
int repeatedNumbers[38];
int input;
int loopcount;
int repeatsx[20];
int repeatsy[20];
int p = 0;
const LAST_LINE_DATABASE = "lastline.txt";

int main(int argc, char **argv)
{
 filed();
 _getch();
 exit(EXIT_SUCCESS);
}
int incrementLine() {
 _asm {
  ADD line[TYPE line * 0], 1;
  ADD line[TYPE line * 1], 1;
  ADD line[TYPE line * 2], 1;
  ADD line[TYPE line * 3], 1;
  ADD line[TYPE line * 4], 1;
  ADD line[TYPE line * 5], 1;
  ADD line[TYPE line * 6], 1;
  ADD line[TYPE line * 7], 1;
  ADD line[TYPE line * 8], 1;
  ADD line[TYPE line * 9], 1;
  ADD line[TYPE line * 10], 1;
  ADD line[TYPE line * 11], 1;
  ADD line[TYPE line * 12], 1;
  ADD line[TYPE line * 13], 1;
  ADD line[TYPE line * 14], 1;
  ADD line[TYPE line * 15], 1;
  ADD line[TYPE line * 16], 1;
  ADD line[TYPE line * 17], 1;
  ADD line[TYPE line * 18], 1;
  ADD line[TYPE line * 19], 1;
  ADD line[TYPE line * 20], 1;
  ADD line[TYPE line * 21], 1;
  ADD line[TYPE line * 22], 1;
  ADD line[TYPE line * 23], 1;
  ADD line[TYPE line * 24], 1;
  ADD line[TYPE line * 25], 1;
  ADD line[TYPE line * 26], 1;
  ADD line[TYPE line * 27], 1;
  ADD line[TYPE line * 28], 1;
  ADD line[TYPE line * 29], 1;
  ADD line[TYPE line * 30], 1;
  ADD line[TYPE line * 31], 1;
  ADD line[TYPE line * 32], 1;
  ADD line[TYPE line * 33], 1;
  ADD line[TYPE line * 34], 1;
  ADD line[TYPE line * 35], 1;
  ADD line[TYPE line * 36], 1;
  ADD line[TYPE line * 37], 1;
 }
 return 1;
}
int initLine() {
 _asm {
  MOV line[TYPE line * 0], 1;
  MOV line[TYPE line * 1], 1;
  MOV line[TYPE line * 2], 1;
  MOV line[TYPE line * 3], 1;
  MOV line[TYPE line * 4], 1;
  MOV line[TYPE line * 5], 1;
  MOV line[TYPE line * 6], 1;
  MOV line[TYPE line * 7], 1;
  MOV line[TYPE line * 8], 1;
  MOV line[TYPE line * 9], 1;
  MOV line[TYPE line * 10], 1;
  MOV line[TYPE line * 11], 1;
  MOV line[TYPE line * 12], 1;
  MOV line[TYPE line * 13], 1;
  MOV line[TYPE line * 14], 1;
  MOV line[TYPE line * 15], 1;
  MOV line[TYPE line * 16], 1;
  MOV line[TYPE line * 17], 1;
  MOV line[TYPE line * 18], 1;
  MOV line[TYPE line * 19], 1;
  MOV line[TYPE line * 20], 1;
  MOV line[TYPE line * 21], 1;
  MOV line[TYPE line * 22], 1;
  MOV line[TYPE line * 23], 1;
  MOV line[TYPE line * 24], 1;
  MOV line[TYPE line * 25], 1;
  MOV line[TYPE line * 26], 1;
  MOV line[TYPE line * 27], 1;
  MOV line[TYPE line * 28], 1;
  MOV line[TYPE line * 29], 1;
  MOV line[TYPE line * 30], 1;
  MOV line[TYPE line * 31], 1;
  MOV line[TYPE line * 32], 1;
  MOV line[TYPE line * 33], 1;
  MOV line[TYPE line * 34], 1;
  MOV line[TYPE line * 35], 1;
  MOV line[TYPE line * 36], 1;
  MOV line[TYPE line * 37], 1;
 }
 return 1;
}
int filed() {
 // We assume argv[1] is a filename to open
 FILE *file = fopen(LAST_LINE_DATABASE, "rb");
 if (file == 0)
 {
  printf("Could not open file\n");
  file = fopen(LAST_LINE_DATABASE, "wb");
  input = rand() % 36;
  repeatedNumbers[0] = input;
  initLine();
  line[input + 1] = 0;
  fwrite(line, sizeof(int), 38, file);
  loopcount = 1;
 }
 else
 {
  printf("File opened\n");
  fread(line, sizeof(int), 38, file);
  for (i = 0; i < 38; i = i + 1) {
   printf("%d ", line[i]);
  }
  fclose(file);
  loopcount = 0;
 }
 fclose(file);
 file = fopen("data.txt", "wb+");
 for (i = 0; i < 100 - loopcount; i++) {
  incrementLine();
  input = rand() % 36;
  
  int switcher = 0;
  for (k = 0; k < sizeof(repeatedNumbers); k++) {
   if (repeatedNumbers[k] == input) {
    repeatsx[p] = input;
    repeatsy[p] = i;
    p = p + 1;
    switcher = 1;
    break;
   }
  }
  if (switcher == 0) {
   repeatedNumbers[sizeof(repeatedNumbers)] = input;
  }
  line[input + 1] = 0;
  if (100 - i < 37 - loopcount) {
   for (k = 0; k < 38; k = k + 1) {
    printf("%d ", line[k]);
   }
  }
  fwrite(line, sizeof(int), 38, file);
  
 }
 fclose(file);
 file = fopen(LAST_LINE_DATABASE, "wb");
 fwrite(line, sizeof(int), 38, file);
 fclose(file);
 printf(",");
 for (i = 0; i < p - 1; i++) {
  printf("%d ",repeatsx[i]);
  printf("%d ", repeatsy[i]);
 }
 printf("%d ", repeatsx[p - 1]);
 printf("%d ", repeatsy[p - 1]);
 printf(",");
 for (k = 0; k < sizeof(repeatedNumbers); k++) {
  printf("%d ", repeatedNumbers[k]);
 }
 
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

Sign in to follow this