+886 Let's roll.

2014年8月8日星期五

從記憶體中讀資料
load date from memory into register
把暫存器中存資料存進記憶體
store register data into memory

               Figure 1. integer registes, 
               source:https://www.cs.cmu.edu/~fp/courses/15213-s07/misc/asm64-handout.pdf

mov operand combinations(mov的運算整理)
mov imm to register, mov $0x11,%eax -> var_a=0x11;
mov imm to mem, mov $0x39,(%eax) -> *p=0x39;
mov reg to reg, mov %edx,%eax -> var_a=var_b;
mov reg to mem, mov %eax,(%edx) -> *p=var_a;
mov mem to reg, mov (%eax),%eax -> var_a=*p;

*can not do memory to memory transfer in single instruction.

Here is an simple swap code:

void swap(int *xp, int *yp)
{
   int a=*xp;
   int b=*yp;

   *xp=b;
   *yp=a;
}

Let's see how above code done by assembly.
Variables store in which memory place and registers is assigned by complier.
讓我們來看上面的程式碼,如何使用組合語言完成,
變數會放在哪個register對應到哪個memory位址,是由complier決定的。


gcc -g -c mov.c -m32 -o mov32

00000000 :
   0:   55                      push   %ebp
   1:   89 e5                   mov    %esp,%ebp
   3:   83 ec 10                sub    $0x10,%esp
//start-- int a=*xp; 
//move Memory[ebp+0x8](xp) to register exa.

//move memory content(*xp) to register eax
//move value(*xp) in eax to Memory[ebp-0x4](variable a).
   6:   8b 45 08                mov    0x8(%ebp),%eax
   9:   8b 00                   mov    (%eax),%eax
   b:   89 45 fc                mov    %eax,-0x4(%ebp)

//end int a=*xp;


//  int b=*yp;
// *yp會存在記憶體中ebp+0xC的位址,先把這位址存到eax中

// 再把exa記憶體中對應的值取出來存到,eax
//接著把exa的值,存到b變數所在的記憶體ebp-0x8中
   e:   8b 45 0c                mov    0xc(%ebp),%eax
  11:   8b 00                   mov    (%eax),%eax
  13:   89 45 f8                mov    %eax,-0x8(%ebp)

//end   int b=*yp;
  16:   8b 45 08                mov    0x8(%ebp),%eax
  19:   8b 55 f8                mov    -0x8(%ebp),%edx
  1c:   89 10                   mov    %edx,(%eax)
  1e:   8b 45 0c                mov    0xc(%ebp),%eax
  21:   8b 55 fc                mov    -0x4(%ebp),%edx
  24:   89 10                   mov    %edx,(%eax)
  26:   c9                      leave
  27:   c3                      ret

X86-64
 gcc -g -c mov.c -o mov64

0000000000000000 :
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   48 89 7d e8             mov    %rdi,-0x18(%rbp)
   8:   48 89 75 e0             mov    %rsi,-0x20(%rbp)
   c:   48 8b 45 e8             mov    -0x18(%rbp),%rax
  10:   8b 00                   mov    (%rax),%eax
  12:   89 45 fc                mov    %eax,-0x4(%rbp)
  15:   48 8b 45 e0             mov    -0x20(%rbp),%rax
  19:   8b 00                   mov    (%rax),%eax
  1b:   89 45 f8                mov    %eax,-0x8(%rbp)
  1e:   48 8b 45 e8             mov    -0x18(%rbp),%rax
  22:   8b 55 f8                mov    -0x8(%rbp),%edx
  25:   89 10                   mov    %edx,(%rax)
  27:   48 8b 45 e0             mov    -0x20(%rbp),%rax
  2b:   8b 55 fc                mov    -0x4(%rbp),%edx
  2e:   89 10                   mov    %edx,(%rax)
  30:   5d                      pop    %rbp
  31:   c3                      retq


reference:
https://www.cs.cmu.edu/~fp/courses/15213-s07/misc/asm64-handout.pdf

2014年6月26日星期四

如果今天要用C語言計算50!,int都是不夠用的。 要解這樣的問題,必需要用陣列。
 32位元系統unsigned int 最大 4,294,967,295 (10位數字)
64位元 uint64_t 18,446,744,073,709,551,615 (20 位數字)

/*從array的高位元開始存值*/
void Big_factorial_iteration(int n)
{
  int i=1;

  /*init array*/
  int a[SIZE_A]= {0};
  int tail=SIZE_A-1;

  a[tail]=1;

  for(i=1; i <= n  ; i++)
  {
    int j;
    /* multiply the value */
    for(j= tail ; j >= 0 ; j--)
    {
      a[j]=a[j]*i;
    }
    /*進位留下個位數,其餘的加點前一位 */
    for(j= tail ; j >= 0 ; j--)
    {
      if (a[j] >= 10)
          a[j-1]=a[j-1]+(a[j]/10);
          a[j]=a[j]%10;
    }
  }

  for(i=0; i< SIZE_A ; i++)
  {
     printf("%d",a[i]);
  }
  printf("\n");

}

int main()
{

  printf(" %d \n",factorial_recursion(10));
  printf(" %d \n",factorial_iteration(10));
  Big_factorial_iteration(20); 計算20階層
}

result: [carlos@localhost c_examples]$ ./factorial_2
 3628800
 3628800
 000000000002432902008176640000

 原始碼:
  https://github.com/tzuCarlos/linux_C/blob/master/c_examples/factorial_2.c

reference source:
http://www.cs.utexas.edu/users/djimenez/utsa/cs3343/lecture20.html http://en.wikipedia.org/wiki/Integer_(computer_science)
http://en.wikipedia.org/wiki/Factorial

2014年6月25日星期三


1.先安裝
sudo apt-get install fortune cowsay

2接著加入以下指令到 bash.bashrc中,這樣每次開啟terminal 或 ssh 就會有隻牛跟你說話囉
sudo vim  /etc/bash.bashrc
 

# Spicing up Terminal
fortune | cowsay -n
echo
source: http://xtremediary.blogspot.tw/2010/04/spice-up-ubuntulinux-terminal-with.html

筆記一下C語言階層的遞迴與迴圈寫法,這個範例不考慮溢位的問題。
#include

/*
*  example for recursion and iteration 
*  I know it should return error if n < 0, but this just a simple example for study.
*  Do not care about overflow issues this example. 
*/
unsigned int factorial_recursion(int n)
{

   /* return n>=1 ? n * factorial_recursion(n-1) : 1; */

   if(n==0)
      return 1;  /*Base case */
   else
      return n * factorial_recursion(n-1); /*General case */

}


unsigned int factorial_iteration(int n)
{
  int i=1;
  int result=1;

  for(i=1; i <= n  ; i++)
  {
    /*result *= i */
    result=result * i;
  }

  return result;
}

int main()
{

  printf(" %d \n",factorial_recursion(10));
  printf(" %d \n",factorial_iteration(10));

}

原始碼:https://github.com/tzuCarlos/linux_C/blob/master/c_examples/factorial.c

2014年6月18日星期三

今天遇到一個bug Web daemon隨機會segmentation fault

想用Strace來debug看看
在這抓 - http://sourceforge.net/projects/strace/files/strace/
./configure --host=powerpc-linux CC=powerpc-linux-gcc LD=powerpc-linux-ld 
make之後就可以放上機器上囉。


在機器上執行:Strace -f -o web.trace webs
神奇的事發生了,這時候我的web daemon就不會掛掉了。
只好,慢慢trace code了,最後是發現有人做這樣的行為,寫C時要小心,別亂copy亂指的。


UCHAR old_pass[32];

UCHAR *passphrase;
strcpy(passphrase, old_pass);


2014年6月17日星期二

gcc -s xxxx 可以篇成組合語言
gcc -g xxxx 之後可以用
objdump -S a.out 看到組語、C code

遇到要debug kernel panic時很好用! :)

example:
[carlos@localhost testC]$ objdump -S ./a.out

./a.out:     file format elf32-i386

080483d4 :

int func1()
{
 80483d4:       55                      push   %ebp
 80483d5:       89 e5                   mov    %esp,%ebp
 80483d7:       83 ec 08                sub    $0x8,%esp
   printf("WAT WAT WAT \n");
 80483da:       c7 04 24 10 85 04 08    movl   $0x8048510,(%esp)
 80483e1:       e8 02 ff ff ff          call   80482e8
}
 80483e6:       c9                      leave
 80483e7:       c3                      ret  

2014年6月12日星期四



a.首先執行fdisk -l, 可以看到我的sd卡是在/dev/sdb1跟/dev/sdb2,基本上只要備份sdb2的file system就夠了。

karose@karose-VirtualBox:~$ sudo fdisk -l

Disk /dev/sda: 21.8 GB, 21802237952 bytes
255 heads, 63 sectors/track, 2650 cylinders, total 42582496 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00079d59

   Device Boot      Start         End      Blocks   Id  System
/dev/sda1   *        2048    39186431    19592192   83  Linux
/dev/sda2        39188478    42582015     1696769    5  Extended
/dev/sda5        39188480    42582015     1696768   82  Linux swap / Solaris

Disk /dev/sdb: 7860 MB, 7860125696 bytes
242 heads, 62 sectors/track, 1023 cylinders, total 15351808 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000

   Device Boot      Start         End      Blocks   Id  System
/dev/sdb1   *        2048      198655       98304    e  W95 FAT16 (LBA)
/dev/sdb2          198656    15351807     7576576   83  Linux


b.使用dd 把/dev/sdb2備份起來到home/backup下面。

 sudo dd if=/dev/sdb2 | gzip -1 > /home/backup/sd_backup.img.gz

c.要還原就用下面的指令。
zcat sd_backup.img.gz > /dev/sdb

source:http://www.gigamegablog.com/2012/09/26/beaglebone-101-linux-tricks-for-backing-up-and-resizing-your-microsd-card/