Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <ctype.h>
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #define BYTES_A_ROW ((int)10)
- #define ADDR_COLUMN_WIDTH ((int)(2*sizeof(unsigned char *)))
- //num bytes of a pointer * 2 char; (1 byte = hex 2 chars)
- #define BYTE_COLUMN_WIDTH ((int)(BYTES_A_ROW * 3))
- // 1 bytes is 2 hex chars + some spaces
- #define COLUMN_SEPARATOR " "
- typedef unsigned char byte_t;
- void printOut(unsigned long start_addr, int length);
- void printHeader();
- int main(int argc, char *argv[] )
- {
- int first_var = 0xaaaaaaaa; // do not change this declaration!!!
- unsigned long start_addr;
- int number_of_bytes;
- if(argc == 3)
- {
- sscanf(argv[1], "%16lx", &start_addr);
- sscanf(argv[2], "%3d", &number_of_bytes);
- printf("\n\nnumber = %3d", number_of_bytes);
- printHeader();
- printOut(start_addr, number_of_bytes);
- }
- else if(argc == 1)
- {
- // print some reference addresses
- printf("FYI: address of main function in memory: %p\n", main );
- printf("FYI: address of argc: %p\n", &argc );
- printf("FYI: address of first local variable of main(): %p\n", &first_var );
- // read start address and memory size
- printf("enter start address <hex-notation> of dump: ");
- scanf("%16lx", &start_addr);
- printf("enter number of bytes to dump <negative or positive value>: " );
- scanf("%3d", &number_of_bytes);
- printHeader();
- printOut(start_addr, number_of_bytes);
- }
- else
- {
- printf("please provide a valid number of arguments.\n");
- return 0;
- }
- printf("\n");
- return 0;
- }
- void printHeader(){
- int i;
- // print table header
- printf("\n%-*s", ADDR_COLUMN_WIDTH, "Address");
- printf("%s", COLUMN_SEPARATOR);
- printf("%-*s", BYTE_COLUMN_WIDTH, "Bytes");
- printf("%s", COLUMN_SEPARATOR);
- printf("%-*s\n", BYTES_A_ROW, "Chars");
- for( i= 0; i < ADDR_COLUMN_WIDTH; i++)
- printf("-");
- printf("%s", COLUMN_SEPARATOR);
- for( i= 0; i < BYTE_COLUMN_WIDTH; i++)
- printf("-");
- printf("%s", COLUMN_SEPARATOR);
- for( i= 0; i < BYTES_A_ROW; i++) // number of chars is char-column is exactly BYTES_A_ROW
- printf("-");
- }
- void printOut(unsigned long int start_addr, int length)
- {
- byte_t *ptr;
- ptr = (unsigned char*) start_addr;
- int j = abs(length);
- int i;
- char charString[BYTES_A_ROW];
- while(j>0)
- {
- //We start by printing the start address of this row
- printf("\n%.6X ", (unsigned int) ptr);
- //Then we loop through the next ? elements
- for(i=0; i<BYTES_A_ROW; i++)
- {
- //check wether or not we want to see the next byte
- if(j!=0)
- {
- //print byte
- printf("%.2X ", *ptr);
- //Check wether or not the char represents a byte
- if(isprint(*ptr)) {charString[i] = *ptr;}
- else {charString[i] = '.';}
- //check whether to inc/dec the pointer and do it
- if(length > 0) {ptr++;}
- else {ptr--;}
- //decrement j
- j--;
- }
- else
- {
- printf(" ");
- }
- }
- printf(" %s", charString);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement