2007-12-31

OPENCORES 網站

OPENCORES提供許多開發完成的IP(Intellectual Property,矽智產),其特色是這些IP都是以Open source形式發佈的,每個IP都以專案進行。

網址:http://www.opencores.org/

2007-12-30

Powerpoint簡報的使用禁忌!

【CentOS】讓帳號ssh登入後可以su到root

修改設定檔
# vi /etc/ssh/sshd_config

在最後面加入設定值
AllowUsers acos

修改完後記得重新啟動sshd服務
# /etc/rc.d/init.d/sshd restart

註:acos→請填入自己的帳號,如果有多個帳號用空格格開就可以

2007-12-27

李開復:與二十一世紀智慧人才的對話

  今天(不!是昨天),追隨李開復博士的兩場演講(選擇的智慧、做二十一世紀的人才),中間還接了兩堂專業選修課程,晚上則是協助阿拉工作站的設定,難得一天可以如此"充實"。廢話不多,以下為聽演講實作的簡單筆記:

選擇的智慧

  1. 用中庸拒絕極端
    ->生活在圓(此指下面列出的左邊)之內,若為之過甚則會有反效果(下面列出的右邊)
    自省 <=> 自卑
    胸懷 <=> 懦弱
    同理心 <=> 盲從
    自信 <=> 自負
    勇氣 <=> 愚勇
    積極 <=> 霸道
  2. 用理智分析情景:
    則善而從(範例,如下面照片內容所示)
    領導力
    六種領導力(指揮命令、宏觀掌控、合諧合作、民主自由、授權負責、指導培養),李博士認為一位優秀領導人應該在不同時機表現不同的領導風格,而不是一招打遍天下。
  3. 用務實發揮影響
    專注影響圈:接受不能改變的事情。
    擴大影響圈:增加可以改變的事情。
  4. 用冷靜掌控抉擇
    ->保持冷靜,尋找機會
    ->抉擇前"重重"思考,抉擇後"輕輕"放下
    ->不要一切非黑即白,用機率論看問題(當自估成功機率達到40~70%則應開始行動)
    ->列出利弊對照表協助抉擇
  5. 用自覺端正態度
    遇到挫折,不會輕言失敗
    取得成績,不會沾沾自喜
  6. 用學習累積經驗
    The journey is the reward.
  7. 用勇氣包契包袱
    李博士以登山為例,當自己爬到山的巔峰可能看見另一座更為高聳的山峰,如果欲征服之,則必須放棄現階段的高度(指下山)才能追求另一個新的格局(指另一座高山)。
  8. 用真心追隨智慧
    價值觀 - 報紙測試法
    理想 - 心靈感應法
    興趣 - If you find a job you love, you will never work a day in your life.


做二十一世紀的人才

  1. 創新實踐者
    What matters is not innovation, but useful innovation.
    價值源於創新
    創新與實踐需配合:動手能力,融會貫通
    ->有用的創新
  2. 跨領域合成者
    In the feature, CIO will not be "Chief Information Officer", but "Chief Information Office"
    例如:Google不單僅是運用網路搜尋的專業技術,其涵蓋了information retrieval、networking、good UI、crawler、hardware與parrallel processing...等技術。
    ->跨越專業的局限
  3. 三商兼高者
    EQ is 9 times more important than IQ.
    IQ:Intelligence Quotient
    EQ:Emotional Quotient
    SQ:Spiritual Quotient
    ->分清善惡,正值誠信的價值觀
  4. 高效能溝通者
    The man who can think and does not know how to express what he thinks is at the level of him who cannot think.
    高效能溝通者激發熱情、信任
    低效能溝通者:沒有思想
    ->高效能溝通者有更多機會
  5. 熱愛工作者
  6. 積極主動者
    對自己的一切負責
    沉默不是金
    不要等待機遇,做好充分的準備
  7. 樂觀向上者
    The glasses half full or half empty depending on whether you're pouring in or out.

2007-12-25

RFID也可以這樣用!?

堅若磐石的華碩螢幕!!


我也要一台XD

e三五教學卓越計畫 - 2008嵌入式系統實務訓練課程

  寒假開的嵌入式系統相關課程已經公告了!請參考網頁資訊→http://www.cslab.iecs.fcu.edu.tw/esrc/news.php?id=6
  至於推不推薦麻~因為是第一次開課也不知道教的程度到哪,不過我覺得只要對該領域有一點點興趣就參加吧,具備邏設基礎應該就可以聽懂大部分課程了!

2007-12-24

Linux到底怎麼唸?!

關於Linux該怎麼唸(發音)這老梗的爭論議題,似乎還是沒有個權威跳出來拍板定案。
不過各地口音本來就不盡相同,因此這也沒什麼好爭論的XD,倒是可以參考Linux創始人的念法,錄音檔請參考→http://tinyurl.com/24xjon

2007-12-23

關於C語言中的volatile修識字

詳細說明請參考網址→http://www.programmersheaven.com/articles/pathak/article1.htm

之前暑假在樓下學SoC程式設計時就遇過volatile這關鍵字,當時授課的助教只說他也不清楚這意思,要大家照抄就是了。現在實驗室也開始玩SoC發展平台,自然的有一部分就是要寫一些程式控制周邊硬體,以上都是廢話XD

由於ARM都是採用memory-map方式存取周邊裝置,因此要對周邊裝置溝通只要把資料丟進記憶體或從記憶體讀取資料就可以了,但這時聰明的編譯器反而可能變成壞了大了事的老鼠屎,原來是幫程式碼最佳化的功能反而成了困擾,請參考底下程式碼:

*ptr = 0;
while(*ptr){
*ptr = 4 ;
*ptr = 0 ;
}

這段內容很可能會被聰明的編譯器給最佳化成了下面的樣子:
*ptr = 0
while(0) {
}

從軟體角度來說,這是編譯器幫不聰明的Programmer化簡了多餘的冗碼;在硬體角度來看,可能就不見得是好事了,如果Programmer原本就是希望*ptr指到的位址訊號一直由0與4交互替換,那這時編譯器就幫倒忙了!
若要避免這窘境發生,可以在宣告*ptr變數時,加上volatile修識字讓每次的存取都乖乖的照作,並且是到記憶體進行讀取,而不使用暫存器。

2007-12-21

Dev-C++在Vista環境下無法編譯的問題

  Dev-C++在Vista系統下似乎都會遇到無法編譯的問題。詳細解法請參考網頁→http://msml92.net/blog/LD/archives/229

  感謝金剛學弟熱情提供資訊!

2007-12-16

整數型態的除法

對新手來說很重要的觀念!
請思考的程式碼印出結果,究竟會印出0.5或是0?

#include <stdio.h>
int main() {
  int a = 10 ;
  int b = 20 ;
  printf("%f\n", a/b) ;
  system("pause") ;
  return 0 ;
}
很多新手應該會選擇0.5吧!確實~以人類思考角度來看0.5應該是正確的,可是在C語言看來0才是正確解答。
在C語言中,除法分為整數除法浮點數除法
  • 整數除法
    電腦僅會算到整數值,至於小數(分數)部分直接省去,並且是無條件捨位。
  • 浮點數除法
    電腦會一路除下去,直到表示位數的最小位數,採用四捨五入。

那究竟什麼時候採用整數除法又什麼時候採用浮點數除法呢?當然不是看電腦心情隨機決定XD
端看除法兩邊的運算元來決定,如果除法的兩個運算子其中一個為浮點數型態(float或double)則電腦就會採用浮點數除法,否則就採用整數除法。上面的例子會採用整數除法,原因是變數a與b都是整數型態,因此採用整數除法。
接著再看以下範例,答案將會是0.666667
#include <stdio.h>
int main() {
  float a = 2 ;
  float b = 3 ;
  printf("%f\n", a/b) ;
  system("pause") ;
  return 0 ;
}

無俚頭的搞笑?!

2007-12-12

SystemC網站推薦

耍蠢...

剛在Ubuntu上設定SystemC的開發環境
configure一直出現下面警告
明明以前就遇過的問題~卻一直沒找到原因...
checking build system type... configure: error: cannot guess build type; you must specify one

後來才發現系統根本沒裝g++套件XD

逢甲圖書館校外Proxy設定

功能說明:
  在校外以HiNet、SeedNet要連線圖書館所訂購的電子資料庫時,應先進行代理伺服器的設定。

Proxy網址:
http://proxy.lib.fcu.edu.tw/proxy.pac

詳細設定說明請參考:
http://www.lib.fcu.edu.tw/eresources/er_outcampus_services.htm

2007-11-12

【X86組語】作業三-第二版

把七張牌值印出來,並且將最大獎的組合用顏色強調,花色代碼改成以圖示顯示。

NEW_LINE MACRO
push ax
push dx
mov ah,02
mov dl,10
int 21h
mov dl,13
int 21h
pop dx
pop ax
ENDM

GET_CHAR MACRO char
push ax
mov ah,01
int 21h
mov char,al
pop ax
ENDM

END_PROCESS MACRO
mov ah,4ch
int 21h
ENDM

.model small

.data
abc equ 61
cba equ 55

card_7 db 7 dup(?)
card_5 db 5 dup(?)
temp_5 db 5 dup(?)
max_prize db ?
max_num db ?
ceq db ?
prize db ?
_mask db 00001000b,00000100b,00000010b,00000001b
pr_tab db 0,1,1,3,1,2,3,7,1,2,2,6,3,6,7,10
card_tab db 1,2,3,4,5, 1,2,3,4,6, 1,2,3,5,6
db 1,2,4,5,6, 1,3,4,5,6, 2,3,4,5,6
db 1,2,3,4,7, 1,2,3,5,7, 1,2,4,5,7
db 1,3,4,5,6, 2,3,4,5,7, 1,2,3,6,7
db 1,2,4,6,7, 1,3,4,6,7, 2,3,5,6,7
db 1,2,5,6,7, 1,3,5,6,7, 2,3,5,6,7
db 1,4,5,6,7, 2,4,5,6,7, 3,4,5,6,7
card_52 db 01h,02h,03h,04h,05h,06h,07h
db 08h,09h,0ah,0bh,0ch,0dh
db 11h,12h,13h,14h,15h,16h,17h
db 18h,19h,1ah,1bh,1ch,1dh
db 21h,22h,23h,24h,25h,26h,27h
db 28h,29h,2ah,2bh,2ch,2dh
db 31h,32h,33h,34h,35h,36h,37h
db 38h,39h,3ah,3bh,3ch,3dh
card_28 db 01h,11h,2dh,34h,35h,26h,08h
db 01h,11h,2ch,05h,15h,26h,27h
db 21h,31h,2bh,34h,35h,36h,37h
db 01h,11h,03h,15h,05h,25h,0ah
mess db ' ** sorry !!! ** $'
db 'one pair. $'
db 'two pairs. $'
db 'three of a kind. $'
db 'straight. $'
db 'flush. $'
db 'full house. $'
db 'four of a king. $'
db 'flush straight. $'
db 'flush royal. $'
db 07h,'%% data error %% $'
;============================================================================================================================
.stack 1000h
;============================================================================================================================
.code
main proc far

mov ax,@data
mov ds,ax

bbloop:
call far ptr cdgen
call far ptr check_7
call far ptr p_result
NEW_LINE
GET_CHAR dl
cmp dl,13 ;press ENTER for next turn
je bbloop
END_PROCESS
main endp
;
;---------------------------------------------------------------------------------------------------------------------------
;
check_7 proc far

mov [max_prize],0
mov [max_num],0

mov cx,21
ckloop1: mov al,05h
mov dl,cl
dec dl
mul dl
mov bx,ax
mov si,5
ckloop2: dec si
mov al,[card_tab + bx + si]
mov di,ax
mov al,[card_7 - 1 + di]
mov [card_5 + si],al
xor si,0
jnz ckloop2

call check_5

mov ah,[prize]
cmp ah,[max_prize]
jbe nextturn

mov [max_prize],ah
mov [max_num],cl
nextturn: loop ckloop1
ret
check_7 endp
;---------------------------------------------------------------------------------------------------------------------------
check_5 proc near
mov [prize],0
mov ah,0fh
call copypure
call sorttemp_5
call compare
cmp [ceq],0
jne setprize

call checkstr

mov ah,30h
call copypure
call compare

cmp [ceq],0fh
jne noflush
cmp1: cmp bh,0
jne cmp2
mov [prize],5
jmp checkexit
cmp2: cmp bh,1
jne cmp3
mov [prize],8
jmp checkexit
cmp3: mov [prize],9
jmp checkexit

noflush: cmp bh,0
je nostraight
mov [prize],4
jmp checkexit

nostraight: mov [ceq],0

setprize: lea bx,pr_tab
mov al,[ceq]
xlat
mov [prize],al

checkexit: ret
check_5 endp
;---------------------------------------------------------------------------------------------------------------------------
copypure proc
mov si,5
pureloop: dec si
mov al,[ card_5 + si ]
and al,ah
mov [ temp_5 + si ],al
cmp si,0
jne pureloop
ret
copypure endp
;---------------------------------------------------------------------------------------------------------------------------
sorttemp_5 proc near
mov si,4
sortloop1: mov al,[ temp_5 + si ]
mov di,0
sortloop2: cmp al,[ temp_5 + di ]
jge sortnext
xchg al,[ temp_5 + di ]
sortnext: inc di
cmp di,si
jne sortloop2
mov [ temp_5 + si ],al
dec si
jnz sortloop1

ret
sorttemp_5 endp
;---------------------------------------------------------------------------------------------------------------------------
compare proc
mov [ceq],0
mov si,0

cmploop: mov ah,[temp_5 + si]
xor ah,[temp_5 + si + 1]
jnz cmpnext
mov al,[_mask + si ]
or [ceq],al
cmpnext: inc si
cmp si,4
jnz cmploop
ret
compare endp
;---------------------------------------------------------------------------------------------------------------------------
checkstr proc near

mov bh,0
mov al,[temp_5 +4]
sub al,[temp_5 +0]
cmp al,4
je addbh
cmp al,12
jne strexit
cmp [temp_5 + 1],10 ;@@?
jne strexit
inc bh
addbh: inc bh
strexit: ret
checkstr endp
;---------------------------------------------------------------------------------------------------------------------------
p_result proc far

mov bl,[max_prize]
mov al,20
mul bl
lea dx,mess
add dx,ax
mov ah,09h
int 21h
cmp bl,0
je pr_exit

mov bl,[max_num]
dec bl
mov al,05h
mul bl
mov bx,ax
mov si,0
temploop: mov dl,[card_tab + bx + si]
mov [temp_5 + si],dl
inc si
cmp si,5
jne temploop

mov si,0
print_7: mov di,0
temploop2: mov dl,[temp_5 + di]
dec dl
mov dh,0
cmp si,dx
jne tempnext2
mov ah,09h
mov bh,0
mov bl,0001100b
mov cx,3
int 10h
tempnext2: inc di
cmp di,5
jne temploop2

mov cl,[card_7 + si]
and cl,0fh
mov ch,[card_7 + si]
and ch,0f0h

mov dl,6 ;spade
cmp ch,30h
je color
mov dl,3 ;heart
cmp ch,20h
je color
mov dl,4 ;diamond
cmp ch,10h
je color
mov dl,5 ;club
color: mov ah,02h
int 21h

;;card value convert
mov dl,'A'
cmp cl,1
je printnext1
mov dl,cl
or dl,30h
cmp cl,9
jbe printnext1
mov dl,'J'
cmp cl,11
je printnext1
mov dl,'Q'
cmp cl,12
je printnext1
mov dl,'K'
cmp cl,13
je printnext1
mov dl,'1'
int 21h
mov dl,'0'
printnext1: int 21h
mov dl,' '
int 21h
inc si
cmp si,7
jne print_7

pr_exit: ret
p_result endp
;---------------------------------------------------------------------------------------------------------------------------
cdgen proc far

call randomize

mov cx,7
mov dh,4
rndloop: call random
lea bx,card_28
mul cl
xor ah,ah
add bx,ax
mov si,cx
mov ah,[bx + si - 1]
mov [card_7 - 1 + si],ah
loop rndloop
ret
cdgen endp
;---------------------------------------------------------------------------------------------------------------------------
randomize proc near
mov ah,2ch
int 21h
;shl dh,1
add dl,dh
ret
randomize endp
;---------------------------------------------------------------------------------------------------------------------------
random proc near

mov al,abc
mul dl
add ax,cba
mov dl,al
mul dh
mov al,ah
ret
random endp
end main
=============================================================================================================================

【X86組語】作業三

把七張牌值印出來,並且將最大獎的組合用顏色強調。

NEW_LINE MACRO
push ax
push dx
mov ah,02
mov dl,10
int 21h
mov dl,13
int 21h
pop dx
pop ax
ENDM

GET_CHAR MACRO char
push ax
mov ah,01
int 21h
mov char,al
pop ax
ENDM


PUT_CHAR MACRO char
mov dl,char
mov ah,02h
int 21h
ENDM

END_PROCESS MACRO
mov ah,4ch
int 21h
ENDM


.model small

.data
abc equ 61
cba equ 55

card_7 db 7 dup(?)
card_5 db 5 dup(?)
temp_5 db 5 dup(?)
max_prize db ?
max_num db ?
ceq db ?
prize db ?
_mask db 00001000b,00000100b,00000010b,00000001b
pr_tab db 0,1,1,3,1,2,3,7,1,2,2,6,3,6,7,10
card_tab db 1,2,3,4,5, 1,2,3,4,6, 1,2,3,5,6
db 1,2,4,5,6, 1,3,4,5,6, 2,3,4,5,6
db 1,2,3,4,7, 1,2,3,5,7, 1,2,4,5,7
db 1,3,4,5,6, 2,3,4,5,7, 1,2,3,6,7
db 1,2,4,6,7, 1,3,4,6,7, 2,3,5,6,7
db 1,2,5,6,7, 1,3,5,6,7, 2,3,5,6,7
db 1,4,5,6,7, 2,4,5,6,7, 3,4,5,6,7
card_52 db 01h,02h,03h,04h,05h,06h,07h
db 08h,09h,0ah,0bh,0ch,0dh
db 11h,12h,13h,14h,15h,16h,17h
db 18h,19h,1ah,1bh,1ch,1dh
db 21h,22h,23h,24h,25h,26h,27h
db 28h,29h,2ah,2bh,2ch,2dh
db 31h,32h,33h,34h,35h,36h,37h
db 38h,39h,3ah,3bh,3ch,3dh
card_28 db 01h,11h,2dh,34h,35h,26h,08h
db 01h,11h,2ch,05h,15h,26h,27h
db 21h,31h,2bh,34h,35h,36h,37h
db 01h,11h,03h,15h,05h,25h,0ah
mess db ' ** sorry !!! ** $'
db 'one pair. $'
db 'two pairs. $'
db 'three of a kind. $'

db 'straight. $'
db 'flush. $'
db 'full house. $'
db 'four of a king. $'
db 'flush straight. $'

db 'flush royal. $'
db 07h,'%% data error %% $'
;============================
.stack 1000h
;============================
.code
main proc far

mov ax,@data
mov ds,ax

bbloop:
call far ptr cdgen
call far ptr check_7
call far ptr p_result
NEW_LINE
GET_CHAR dl
cmp dl,13 ;press ENTER for next turn
je bbloop
END_PROCESS
main endp
;
;---------------------------------------
;
check_7 proc far


mov [max_prize],0
mov [max_num],0

mov cx,21
ckloop1: mov al,05h
mov dl,cl
dec dl
mul dl
mov bx,ax
mov si,5
ckloop2: dec si
mov al,[card_tab + bx + si]
mov di,ax
mov al,[card_7 - 1 + di]
mov [card_5 + si],al
xor si,0
jnz ckloop2

call check_5

mov ah,[prize]
cmp ah,[max_prize]
jbe nextturn

mov [max_prize],ah
mov [max_num],cl
nextturn: loop ckloop1
ret
check_7 endp
;-------------------------------
check_5 proc near
mov [prize],0
mov ah,0fh
call copypure
call sorttemp_5
call compare
cmp [ceq],0
jne setprize

call checkstr


mov ah,30h
call copypure
call compare

cmp [ceq],0fh
jne noflush
cmp1: cmp bh,0
jne cmp2
mov [prize],5
jmp checkexit
cmp2: cmp bh,1
jne cmp3
mov [prize],8
jmp checkexit
cmp3: mov [prize],9
jmp checkexit

noflush: cmp bh,0
je nostraight
mov [prize],4
jmp checkexit

nostraight: mov [ceq],0

setprize: lea bx,pr_tab
mov al,[ceq]
xlat
mov [prize],al

checkexit: ret
check_5 endp
;----------------------------
copypure proc
mov si,5
pureloop: dec si
mov al,[ card_5 + si ]
and al,ah
mov [ temp_5 + si ],al
cmp si,0
jne pureloop
ret
copypure endp
;--------------------------
sorttemp_5 proc near
mov si,4
sortloop1: mov al,[ temp_5 + si ]
mov di,0
sortloop2: cmp al,[ temp_5 + di ]
jge sortnext
xchg al,[ temp_5 + di ]
sortnext: inc di
cmp di,si
jne sortloop2
mov [ temp_5 + si ],al
dec si
jnz sortloop1

ret
sorttemp_5 endp
;----------------------------
compare proc
mov [ceq],0
mov si,0


cmploop: mov ah,[temp_5 + si]
xor ah,[temp_5 + si + 1]
jnz cmpnext
mov al,[_mask + si ]
or [ceq],al
cmpnext: inc si
cmp si,4
jnz cmploop
ret
compare endp
;------------------------------
checkstr proc near

mov bh,0
mov al,[temp_5 +4]
sub al,[temp_5 +0]
cmp al,4
je addbh
cmp al,12
jne strexit
cmp [temp_5 + 1],10 ;@@?
jne strexit
inc bh
addbh: inc bh
strexit: ret
checkstr endp
;---------------------------
p_result proc far

mov bl,[max_prize]
mov al,20
mul bl
lea dx,mess
add dx,ax
mov ah,09h
int 21h
cmp bl,0
je pr_exit

mov bl,[max_num]
dec bl
mov al,05h
mul bl
mov bx,ax
mov si,0
temploop: mov dl,[card_tab + bx + si]
mov [temp_5 + si],dl
inc si
cmp si,5
jne temploop

mov si,0
print_7: mov di,0
temploop2: mov dl,[temp_5 + di]
dec dl
mov dh,0
cmp si,dx
jne tempnext2
mov ah,09h
mov bh,0
mov bl,0001100b
mov cx,3
int 10h
tempnext2:
inc di
cmp di,5
jne temploop2


mov cl,[card_7 + si]
mov ch,cl
and ch,0f0h
or ch,30h
PUT_CHAR ch
mov ch,cl
and ch,0fh
cmp ch,9
jbe not_convert
add ch,7h
not_convert:
add ch,30h
PUT_CHAR ch
PUT_CHAR ' '


inc si
cmp si,7
jne print_7

pr_exit: ret
p_result endp
;-----------------------------
cdgen proc far

call randomize

mov cx,7
mov dh,4
rndloop: call random
lea bx,card_28
mul cl
xor ah,ah
add bx,ax
mov si,cx
mov ah,[bx + si - 1]
mov [card_7 - 1 + si],ah
loop rndloop
ret
cdgen endp
;-------------------------
randomize proc near
mov ah,2ch
int 21h
;shl dh,1
add dl,dh
ret
randomize endp
;-------------------------
random proc near


mov al,abc
mul dl
add ax,cba
mov dl,al
mul dh
mov al,ah
ret
random endp
end main

2007-11-07

【94-上】薛念林-資料庫(期中考)

  跟同學A到的考古題,不過我看一下感覺錯誤一堆...




【關鍵字:94-上、薛念林、資料庫系統、期中考、考古題】

2007-11-01

【9X-上】徐泓洋-組合語言(期中考)

某學弟好心整理的考古題(含解答)
1.說明下列三到指令之功能,並敘述多種用法:

1) 指令功能說明
a.AND x,y 讓 x 與 y 做 AND 邏輯運算,並把結果存在 x
b.OR x,y 讓 x 與 y 做 OR 邏輯運算,並把結果存在 x
c.XOR x,y 讓 x 與 y 做 OR 邏輯運算,並把結果存在 x
2) 指令應用
A. and
對某些位元作清除(清除為0),如:要將1byte的第1、5位元清除為0,並保留其他位元的值
可用 and al,11011101b
B. or
對某些位元作設定(設定為1),如:要將1byte的第1、5位元設為1
可用 or al, 00100010b
C. xor
對某些位元作0、1轉換,如:要對1byte的第1、5位元作0、1轉換
可用xor al, 00100010b
2.說明80x86 cpu 之 addressing mode
2)
80X86指令的定址法共分三類七大定址法,所謂的三類即立即定址法、暫存器定址法、與記憶體定址法,其中記憶體定址法又分為五種,所以總共是七大定址法。
一、立即定址法(Immediate Addressing Mode)
二、暫存器定址法(Register Addressing Mode)
三、記憶體直接定址法(Direct memory Addressing Mode)或直接定址法(Direct Addressing Mode)
四、記憶體間接定址法(Indirect memory Addressing Mode)或間接定址法(Indirect Addressing Mode)
五、基底定址法(Based Addressing Mode).
六、索引定址法(Indexed Addressing Mode)
七、基底索引定址法(Based Indexed Addressing Mode)
以下我們對各種定址法分別加以說明:
 暫存器定址法(Register Addressing Mode):運算元是暫存器,就是暫存器定址法。
* 例如: MOV DS,AX
此指令以暫存器定址法取得,AX暫存器的資料,之後以暫存器定址法寫入到DS暫存器中。
* 例如: MOV MEM1,AX
第一個運算元MEM1 不是暫存器定址法,第二個運算元AX是使用暫存器定址法。
* 例如: MOV AX,BX
說明:上述指令執行完後,AX、BX內容相同。在80X86的暫存器群中,區段暫存器的使用有其限制,即區段暫存器不能互相傳送資料,例如:將CS暫存器的內容存入DS暫存器中,則必須寫成如下格式。MOV AX,CS
MOV DS,AX。
* 例 : INC AX
說明:運算元為AX暫存器。執行後,AX暫存器的內容加1。
* 例 : PUSH BX
說明:運算元為BX暫存器。執行後,BX暫存器的內容存入堆疊中 。
 立即定址法(Immediate Addressing Mode):運算元是一個數字(立即值),就是所謂的立即定址法。* 如右例:
 記憶體直接定址法(Direct memory Addressing Mode):是記憶體定址法的一種,直接定址法就是運算元直接指出資料所在記憶體的位址的方法,如右圖:
執行之後AX=5678;PI是所謂的資料標名,組譯時會算出其PI的實際位址。
* 例 : MOV AL,VALUE
說明:上述指令之運算元VALUE為一資料變數,VALUE必須在資料區段中定義。假設我們在資料區段中定義"VALUE DB 100H",且記憶體100H中的資料如右圖所示,則上述指令執行完後,AL=01H。
 間接定址法 (Indirect Addressing Mode)
將暫存器的值當做是記憶體的位址,而暫存器可以看成是個資料的指標,到此位址去取得運算元的方法,而暫存器能是BX、BP、SI或DI,暫存器名必須用中括號[ ]括起來。如右圖所示以上是把BX內含視為一位址,再依此位址所指之內容搬至AX暫存器內。
 基底定址法 (Based Addressing Mode)
BX及BP暫存器有一項特殊用途即是做為基底暫存器使,那基底定址法就是以基底暫存器所指的位址為基底,再加上一個固定的距離來得到資料所在的位址。
 索引定址法(Indexed Addressing Mode)
索引定址法與基底定址法類似,但索引定址法是以固定的位址為基底再加上索引暫存器SI或Dl的值以得出資料所在的位址,因為是用SI與Dl這兩個索引暫存器,所以叫索引定址法,尤其處理一維陣列的元素,索引定址法最方便。
[註]:SI或DI暫存器都可透過加減指令來改變其內容。

 基底索引定址法(Based Indexed Addressing Mode)
基底索引定址法與索引定址法類似,但是基底索引定址法有兩個變數,一個基底暫存器,另一個是索引暫存器,如此在處理二維陣列的元素,基底索引定址法最方便。例如:執行前,已知AX=3388H,SI=0001H,SI=0002H,MEM1 DW 1234H,5678H
[註1]:基底暫存器與索引暫存器都可透過加減指令來改變其內容。
[註2]:以上這些記憶體定址法的表示法都很有彈性,例如以下四種寫法結果都是相同的:
MOV AX,[BX+DI+3] MOV AX,[BX+3][DI]
MOV AX,[BX+DI]3 MOV AX,[BX][DI][3]
[註3]:在記憶體間接定址法中包含三種定址法,即基底定址法、索引定址法與基底索引定址法,必須注意的是,其運算元只能使用BX,BP,SI,DI這四個暫存器,不可使用其它暫存器。例如指令"MOV AX,[CX]"即是一個錯誤的例子。

3.說明ZF,CF,SF,OF四旗標(flog)之意義
3)
ZF (零旗標),運算結果為零時,此旗標會被設定為 1,若比較相同兩數, ZF 也會被設為一,若比較不相同的兩數,ZF 會被清除為零。
CF (進位旗標)表示進位或借位。如果加法有進位(80h+80h=100h),則此位元會被設為 1,當然減法乘法除法也是一樣,對減法來講就是借位。
SF (符號旗標),運算結果為負數,就是最高位元為 1 時,SF 會被設為 1,否則被清除。
OF (溢位旗標),可以反映出運算結果是否超出有號數之範圍。

4.下列各指令會檢查哪些旗標?
A. JBE B. JAG C. JG
D. JB E. JLE
4)
a.CF or ZF
b.
c.ZFand SF 、OF
d.CF
e.ZF or SF 、 OF

5.請說明bubble sort 之工作原理,請以80X86組合語言設計bubble sort之program

GETCHAR  MACRO char
mov ah,01h
int 21h
mov char,al
ENDM
PUTCHAR MACRO char
mov ah,02h
mov dl,char
int 21h
ENDM
END_PROCESS MACRO
mov ah,4ch
int 21h
ENDM
NEW_LINE MACRO
mov ah,02h
mov dl,0dh
int 21h
mov dl,0ah
int 21h
ENDM
.model small
.data
run_time equ 5
temp db 5 dup(?)


.stack
.code
mov ax,@data
mov ds,ax
mov si,run_time
begin: dec si
GETCHAR [temp+si]
NEW_LINE
cmp si,0
jnz begin
mov di,run_time
sort: dec di
mov si,run_time
bobble: dec si
mov al,temp[si]
cmp al,temp[si-1]
jle bobblenext
xchg al,temp[si-1]
mov temp[si],al
bobblenext:
cmp si,1
jnz bobble
cmp di,0
jnz sort
mov si,run_time
print: dec si
PUTCHAR temp[si]
cmp si,0
jnz print
END_PROCESS
.exit
END

2007-10-27

資訊系教戰守則!?

原來修電腦是這樣修的!!

2007-10-22

【X86組語】作業二-第二版

;;修正第二運算元,第二運算元如果只有一位元,可以選擇按enter鍵即進行運算。
;;前一版請參考http://new-acos.blogspot.com/2007/10/x86_21.html
GETCHAR MACRO char
push ax
mov ah,01h
int 21h
mov char,al
pop ax
ENDM
PUTCHAR MACRO char
push dx
push ax
mov dl,char


mov ah,02h
int 21h
pop ax
pop dx
ENDM
END_PROCESS MACRO
mov ah,4ch
int 21h
ENDM

.MODEL SMALL
.DATA
values db 2 dup(?)
operator db 1 dup(?)
answer db 1 dup(?)

.STACK

.CODE
main_pro proc far


mov dl,3
count_loop: mov si,0
keyin_loop: GETCHAR bl
cmp bl,'+'
je go_1
cmp bl,'-'
jne continue
go_1: cmp si,0
je invalid
mov [operator],bl
jmp keyin_loop
go_2: mov [operator],bl
jmp finish

continue: call check_num
mov cl,bl
GETCHAR bl
cmp bl,'+'
je go_2
cmp bl,'-'
je go_2
cmp bl,0dh
je finish
mov al,10
mul cl
mov cl,al
call check_num
add cl,bl
finish: mov [values+si],cl
inc si
cmp si,2
jne keyin_loop

mov al,[values]
mov bl,[values+1]
mov cl,[operator]
cmp cl,'-'

jne do_add
sub al,bl
mov [answer],al
call print_ans
jmp ok
do_add: add al,bl
mov [answer],al
call print_ans
ok: dec dl
jnz count_loop

END_PROCESS
main_pro endp

check_num proc far
cmp bl,'0'

jl invalid
cmp bl,'9'
jg invalid
sub bl,'0'

ret
check_num endp

print_ans proc far
call cr
xor ax,ax
mov al,[values]
call print_num
PUTCHAR [operator]
xor ax,ax
mov al,[values+1]
call print_num
PUTCHAR '='
xor ax,ax
mov al,[answer]
call print_num
call lf
ret
print_ans endp

print_num proc far
push cx
mov ch,1
cmp al,100
jb ignore_h
xor ch,ch
PUTCHAR '1'
sub al,100
ignore_h: mov cl,10
div cl
cmp al,0
jne go_3
cmp ch,0
jne go_4
go_3: add al,'0'

PUTCHAR al
go_4: add ah,'0'
PUTCHAR ah
pop cx
ret
print_num endp

cr proc near
push ax
push dx
mov ah,2
mov dl,0dh
int 21h
pop dx
pop ax
ret
cr endp

lf proc far
push ax
push dx
call cr
mov ah,2
mov dl,0ah
int 21h
pop dx
pop ax
ret
lf endp


invalid: PUTCHAR '!'
END_PROCESS
END

2007-10-21

【X86組語】作業二

作業二,0~99兩數字加減法


;;;; 程式說明 ;;;;
;; 使用者輸入一算數
GETCHAR MACRO char
push ax
mov ah,01h
int 21h
mov char,al
pop ax
ENDM
PUTCHAR MACRO char
push dx
push ax
mov dl,char

mov ah,02h
int 21h
pop ax
pop dx
ENDM
END_PROCESS MACRO
mov ah,4ch
int 21h
ENDM

.MODEL SMALL
.DATA
values db 2 dup(?)

operator db 1 dup(?)

.STACK

.CODE
main_pro proc far

mov dl,3
count_loop: mov si,0
keyin_loop: GETCHAR bl
cmp bl,'+'

je go_1
cmp bl,'-'
jne continue
go_1: cmp si,0
je invalid
mov [operator],bl
jmp keyin_loop
go_2: mov [operator],bl
jmp finish
continue: call check_num
mov cl,bl
GETCHAR bl
cmp bl,'+'

je go_2
cmp bl,'-'
je go_2
mov al,10
mul cl
mov cl,al
call check_num
add cl,bl
finish: mov [values+si],cl
inc si
cmp si,2
jne keyin_loop

mov al,[values]
mov bl,[values+1]
mov cl,[operator]
cmp cl,'-'
jne do_add
sub al,bl
call print_ans
jmp ok
do_add: add al,bl
call print_ans
ok: dec dl
jnz count_loop

END_PROCESS
main_pro endp



check_num proc far
cmp bl,'0'

jl invalid
cmp bl,'9'
jg invalid
sub bl,'0'
ret
check_num endp

print_ans proc far
PUTCHAR '='
cmp al,100
jb ignore_h
PUTCHAR '1'

sub al,100
ignore_h: mov cl,10
div cl
add al,'0'
add ah,'0'
PUTCHAR al
PUTCHAR ah
call cr_lf
ret
print_ans endp


cr_lf proc far
push ax
push dx
mov ah,2
mov dl,0dh
int 21h
mov dl,0ah
int 21h
pop dx
pop ax
ret
cr_lf endp


invalid: PUTCHAR '!'
END_PROCESS
END

2007-10-15

【X86組語】作業一

作業一
說明:
  使用者每次輸入五個數值(五張撲克牌),若輸入錯誤牌值或是輸入'!'字元程式結束。
  程式不印中獎名稱,改印中獎編號。
PS. 僅接受01~0d, 11~1d, 21~2d, 31~3d(限小寫)

GETCHAR     MACRO   char
mov ah,01h
int 21h
mov char,al
ENDM
PUTCHAR MACRO char
mov ah,02h
mov dl,char
int 21h
ENDM
END_PROCESS MACRO
mov ah,4ch
int 21h
ENDM


.MODEL SMALL
.DATA
abc equ 61
cde equ 55
key_temp db 2 dup(?)
card_5 db 5 dup(?)
temp_5 db 5 dup(?)
max_prize db ?
max_num db ?
ceq db ?
prize db ?
_mask db 00001000b,00000100b,00000010b,00000001b
pr_tab db 0,1,1,3,1,2,3,7,1,2,2,6,3,6,7,10
card_tab db 1,2,3,4,5, 1,2,3,4,6, 1,2,3,5,6
db 1,2,4,5,6, 1,3,4,5,6, 2,3,4,5,6
db 1,2,3,4,7, 1,2,3,5,7, 1,2,4,5,7
db 1,3,4,5,7, 2,3,4,5,7, 1,2,3,6,7
db 1,2,4,6,7, 1,3,4,6,7, 2,3,4,6,7
db 1,2,5,6,7, 1,3,5,6,7, 2,3,5,6,7
db 1,4,5,6,7, 2,4,5,6,7, 3,4,5,6,7
card_52 db 01h,02h,03h,04h,05h,06h,07h
db 08h,09h,0ah,0bh,0ch,0dh
db 11h,12h,13h,14h,15h,16h,17h
db 18h,19h,1ah,1bh,1ch,1dh
db 21h,22h,23h,24h,25h,26h,27h
db 28h,29h,2ah,2bh,2ch,2dh
db 31h,32h,33h,34h,35h,36h,37h
db 38h,39h,3ah,3bh,3ch,3dh
mess db '** sorry !! ** $'
db ' ===> 1 $'
db ' ===> 2 $'
db ' ===> 3 $'

db ' ===> 4 $'
db ' ===> 5 $'
db ' ===> 6 $'

db ' ===> 7 $'
db ' ===> 8 $'
db ' ===> 9 $'

db 07h, ' %% error %% $'
;----------------------------------------------------------
.STACK 1000h
.CODE
main proc far
;
mov ax,@data
mov ds,ax

continue: mov di,5
key_round: GETCHAR [key_temp]
cmp [key_temp], '!'
je exit
GETCHAR [key_temp+1]
cmp [key_temp+1], '!'
je exit
PUTCHAR ' '

call transform
dec di
xor di,0
jne key_round
call check_5
;
call far ptr p_result
;
jmp continue

exit: END_PROCESS
main endp
;

transform proc
mov si,2
trans_run: mov ch,[key_temp-1+si]
cmp ch,'0'
jl err
cmp ch,'9'
jle is_num
cmp ch,'a'

jl err
cmp ch,'f'
jg err
sub ch,87
jmp go_f
is_num: sub ch,'0'
go_f: mov [key_temp-1+si],ch
dec si
xor si,0
jnz trans_run
;
mov cl,[key_temp]
mov al,16
mul cl
mov cl,[key_temp+1]
add al,cl
mov [card_5+di-1],al
ret
transform endp

err: PUTCHAR 'E'
PUTCHAR 'R'

PUTCHAR 'R'
PUTCHAR 'O'
PUTCHAR 'R'
PUTCHAR '!'
PUTCHAR '!'

END_PROCESS
;-----------------------------------------------------------------
check_5 proc near
mov [prize],0
mov ah,0fh
call copypure
call sorttemp_5
call compare
cmp [ceq],0
jne setprize

call checkstr

mov ah,30h
call copypure
call compare

cmp [ceq],0fh
jne noflush
cmp1: cmp bh,0
jne cmp2
mov [prize],5
jmp checkexit
cmp2: cmp bh,1
jne cmp3
mov [prize],8
jmp checkexit
cmp3: mov [prize],9
jmp checkexit

noflush: cmp bh,0
je nostraight
mov [prize],4
jmp checkexit

nostraight: mov [ceq],0

setprize: lea bx,pr_tab
mov al,[ceq]
xlat
mov [prize],al


checkexit: ret
check_5 endp
;---------------------------------------------------------------
copypure proc
mov si,5
pureloop: dec si
mov al,[card_5 + si]
and al,ah
mov [temp_5 + si],al
cmp si,0
jne pureloop
ret
copypure endp
;--------------------------------------------------------------
sorttemp_5 proc near
mov si,4
sortloop1: mov al,[ temp_5 + si ]
mov di,0
sortloop2: cmp al,[ temp_5 + di ]
jge sortnext
xchg al,[ temp_5 +di ]
sortnext: inc di
cmp di,si
jne sortloop2
mov [ temp_5 + si ],al
dec si
jnz sortloop1

ret
sorttemp_5 endp
;--------------------------------------------------------------
compare proc
mov [ceq],0
mov si,0

cmploop: mov ah,[temp_5 + si]
xor ah,[temp_5 + si + 1]
jnz cmpnext
mov al,[_mask + si]
or [ceq],al
cmpnext: inc si
cmp si,4
jnz cmploop
ret
compare endp
;--------------------------------------------------------------
checkstr proc near
mov bh,0
mov al,[temp_5 +4]
sub al,[temp_5 +0]
cmp al,4
je addbh
cmp al,12
jne strexit

mov al,[temp_5+1]
cmp al,10
jne strexit
inc bh
addbh: inc bh
strexit: ret
checkstr endp
;----------------------------------------------------
p_result proc far
mov bl,[prize]
mov al,16
mul bl
lea dx,mess
add dx,ax
mov ah,09h
int 21h
cmp bl,0
ret
p_result endp
END main

【X86組語】上課用講義內容

徐泓洋老師上課教學用的程式碼。
功能說明:程式每次執行會自動抓取亂數設定牌值與花色,並且依照亂數產生的牌判斷得到的是one pair、two pair...等獎項或是槓龜...


.MODEL SMALL
.DATA
abc equ 61
cde equ 55

card_7 db 7 dup(?)
card_5 db 5 dup(?)
temp_5 db 5 dup(?)
max_prize db ?
max_num db ?
ceq db ?
prize db ?
_mask db 00001000b,00000100b,00000010b,00000001b
pr_tab db 0,1,1,3,1,2,3,7,1,2,2,6,3,6,7,10
card_tab db 1,2,3,4,5, 1,2,3,4,6, 1,2,3,5,6
db 1,2,4,5,6, 1,3,4,5,6, 2,3,4,5,6
db 1,2,3,4,7, 1,2,3,5,7, 1,2,4,5,7
db 1,3,4,5,7, 2,3,4,5,7, 1,2,3,6,7
db 1,2,4,6,7, 1,3,4,6,7, 2,3,4,6,7
db 1,2,5,6,7, 1,3,5,6,7, 2,3,5,6,7
db 1,4,5,6,7, 2,4,5,6,7, 3,4,5,6,7
card_52 db 01h,02h,03h,04h,05h,06h,07h
db 08h,09h,0ah,0bh,0ch,0dh
db 11h,12h,13h,14h,15h,16h,17h
db 18h,19h,1ah,1bh,1ch,1dh
db 21h,22h,23h,24h,25h,26h,27h
db 28h,29h,2ah,2bh,2ch,2dh
db 31h,32h,33h,34h,35h,36h,37h
db 38h,39h,3ah,3bh,3ch,3dh
mess db ' ** sorry !!! ** $'
db 'one pair $'
db 'two pairs $'
db 'three of a kind $'

db 'straight $'
db 'flush $'
db 'full house $'
db 'four of a kind $'
db 'flush straight $'

db 'flush royal $'
db 07h, '%% data error %% $'
;----------------------------------------------------------
.STACK 1000h
.CODE
main proc far
;
mov ax,@data
mov ds,ax
;
call far ptr cdgen
;
call far ptr check_7
;
call far ptr p_result
;
mov ah,4ch
int 21h
main endp
;
;----------------------------------------------------------
;
check_7 proc far
;
mov [max_prize],0
mov [max_num],0
;
mov cx,21
ckloop1: mov al,05h
mov dl,cl
dec dl
mul dl
mov bx,ax
mov si,5
ckloop2: dec si
mov al,[card_tab + bx + si]
mov di,ax
mov al,[card_7 - 1 + di]
mov [card_5 + si],al
xor si,0
jnz ckloop2
;
call check_5
;
mov ah,[prize]
cmp ah,[max_prize]
jbe nextturn
;
mov [max_prize],ah
mov [max_num],cl
nextturn: loop ckloop1
ret
check_7 endp
;-----------------------------------------------------------------
check_5 proc near
mov [prize],0
mov ah,0fh
call copypure
call sorttemp_5
call compare
cmp [ceq],0
jne setprize

call checkstr

mov ah,30h
call copypure
call compare


cmp [ceq],0fh
jne noflush
cmp1: cmp bh,0
jne cmp2
mov [prize],5
jmp checkexit
cmp2: cmp bh,1
jne cmp3
mov [prize],8
jmp checkexit
cmp3: mov [prize],9
jmp checkexit

noflush: cmp bh,0
je nostraight
mov [prize],4
jmp checkexit

nostraight: mov [ceq],0

setprize: lea bx,pr_tab
mov al,[ceq]
xlat
mov [prize],al

checkexit: ret
check_5 endp
;---------------------------------------------------------------
copypure proc
mov si,5
pureloop: dec si
mov al,[card_5 + si]
and al,ah
mov [temp_5 + si],al
cmp si,0
jne pureloop
ret
copypure endp
;--------------------------------------------------------------
sorttemp_5 proc near
mov si,4
sortloop1: mov al,[ temp_5 + si ]
mov di,0
sortloop2: cmp al,[ temp_5 + di ]
jge sortnext
xchg al,[ temp_5 +di ]
sortnext: inc di
cmp di,si
jne sortloop2
mov [ temp_5 + si ],al
dec si
jnz sortloop1

ret
sorttemp_5 endp
;--------------------------------------------------------------
compare proc
mov [ceq],0
mov si,0

cmploop: mov ah,[temp_5 + si]
xor ah,[temp_5 + si + 1]
jnz cmpnext
mov al,[_mask + si]
or [ceq],al
cmpnext: inc si ;74
cmp si,4
jnz cmploop
ret
compare endp
;--------------------------------------------------------------
checkstr proc near
mov bh,0
mov al,[temp_5 +4]
sub al,[temp_5 +0]
cmp al,4
je addbh
cmp al,12
jne strexit
cmp [temp_5 + si],10
jne strexit
cmp [temp_5 + si],10
jne strexit
inc bh
addbh: inc bh
strexit: ret
checkstr endp
;----------------------------------------------------
p_result proc far
mov bl,[max_prize]
mov al,20
mul bl
lea dx,mess
add dx,ax
mov ah,09h
int 21h
cmp bl,0
je pr_exit


mov bl,[max_num]
dec bl
mov al,05h
mul bl
mov bx,ax
mov ah,02h
mov dl,[card_tab + bx + 0]
or dl,30h
int 21h

mov si,1
prloop: mov dl,","
int 21h
mov dl,[card_tab + bx + si]
or dl,30h
inc si
cmp si,5
jne prloop
pr_exit: ret
p_result endp
;----------------------------------------------------
cdgen proc far

call randomize


mov cx,7
mov dh,52
rndloop: call random
lea bx,card_52
xor ah,ah
add bx,ax
mov ah,[bx]
mov si,cx
mov [card_7 - 1 + si],ah
xchg ah,[card_52 + 44 + si]
mov [bx],ah
dec dh
loop rndloop
ret
cdgen endp
;----------------------------------------------------
randomize proc near
mov ah,2ch
int 21h
shl dh,1
add dl,dh
ret
randomize endp
;----------------------------------------------------
random proc near

mov al,abc
mul dl
add ax,cde
mov dl,al
mul dh
mov al,ah
ret
random endp
END main

2007-10-09

【Ubuntu】7.10光碟開始提供索取申請

  這幾天讓人很興奮的是Ubuntu 7.10終於要釋出了!今天已經進入倒數九天了,從倒數十一天起就一直跑去Ubuntu官網晃,關注了兩天終於開放申請索取7.10的光碟,身為Ubuntu的忠實愛好者,當然也要趕緊來參一腳。這次申請選項少了一點,預設的光碟索取組合變得比較『不浪費』,這次預設選項最多2張光碟片,可以選擇兩張PC版的或是選擇PC、64bit版各一張。
  有興趣的使用者也可已到https://shipit.ubuntu.com/申請,如果需要地址翻譯的話可以參考台灣郵政網頁提供的轉換服務

2007-10-03

【X86組語】大小寫轉換

題目說明:
  等待使用者輸入字母('a'~'z'與'A'~'Z'),並做大小寫轉換。如果使用者輸入小寫字母,則螢幕印出對應的大寫字母,反之印出對應小寫字母,若輸入字母以外的字元則結束程式。

程式流程:

程式碼:

GETCHAR  MACRO
mov ah, 01h
int 21h
ENDM
PUTCHAR MACRO
mov ah, 02h
int 21h
ENDM
END_PROCESS MACRO
mov ah, 4ch
int 21h
ENDM

.MODEL SMALL
.CODE
begin: GETCHAR
cmp al, 'A'
jl exit
cmp al, 'Z'

jle upper
cmp al, 'a'
jl exit
cmp al, 'z'
jg exit
sub al, 20h
mov dl, al
PUTCHAR
jmp begin
upper: add al, 20h
mov dl, al
PUTCHAR
jmp begin
exit: END_PROCESS
.STACK
END begin

程式說明:
  輸入輸出巨集請參考課本程式5-0,程式流程從begin標籤開始。

2007-10-01

i-city 網路城市

滿特別的網站,內容是介紹逢甲附近商圈的店家,有地圖、論壇提供消費分享資訊。
位址:http://www.i-city.com.tw/

2007-09-18

MASM操作說明

  • 版本說明:提供下載版本是6.11。目前最新版本有8.0,不過必須搭配Visual C++ 2005 Express Edition,避免麻煩用跟課本一樣的版本就好。
  • IBM80X86組合語言實務 施威銘著
  • 環境設定說明:
    step1) 下載檔案:http://www.box.net/shared/8dnahg31c5

    step2) 解壓縮後會產生『MASM611』資料夾

    step3) 把資料夾移到C槽下(或移到你想放的路徑,在此以C:\MASM611路徑為示範)
    step4) 點選『我的電腦』右鍵→『內容』,選擇『進階』頁面。
    step5) 開啟『環境變數』。在下面『系統變數』裡找到『Path』並點選編輯,在跳出的視窗中,於『變數值』欄位新增『;C:\MASM611
    step6) 完成以上設定就可以使用MASM了。

  • 操作說明:
    step1) 參考課本2-3節的『啟動MASM』,用文字編輯器把程式2-1輸入好並存檔(存檔路徑建議選擇較簡單的路徑:在C槽底下建立新資料夾『ASM』,把檔案存在該路徑底下)。

    step2) 點選『開始』→『執行』,輸入『cmd』後按Enter鍵會開啟『命令提示字元』視窗
    step3) 輸入指令cd c:\ASM以切換到ASM資料夾(如果你檔案存在其他地方請輸入對應的路徑),此時你可以下指令dir查看目錄內的檔案。

    step4) 組譯程式,下指令ml prog2_1.asm,程式就會自動完成編譯動作,詳細的關係可以參考課本2-3節的解說。

    step5) 組譯完後會自動產生PROG2_1.EXEPROG2_1.obj兩個檔案(你可以下dir查看目前資料夾的檔案內容),接著測試程式直接輸入PROG2_1.EXE即可(此時應該會在螢幕上印出字元A)。

2007-09-09

Googlepedia

  Googlepedia是FireFox瀏覽器結合google搜尋所出的的個套件。讓使用者在使用FireFox作google搜尋時,可以同時找到維基百科中對應或相關的文章。
  
https://addons.mozilla.org/firefox/2517/ 點頁面上的Install Now」後,等安裝完成,再重新啟動FireFox,就可以使用Google搜尋時,同時得到wikipedia的結果。
  參考畫面:


預設顯示樣式
隱藏Google搜尋結果
隱藏維基搜尋結果

2007-08-26

【Ubuntu】安裝Adobe Reader(64-bit與32-bit皆適用)

step1) 加入金鑰
$ wget -q http://medibuntu.sos-sts.com/repo/medibuntu-key.gpg -O- | sudo apt-key add -

step2) 編輯套件來源
$ sudo gedit /etc/apt/sources.list
加入以下內容
## Medibuntu - Ubuntu 7.04 "feisty fawn"
## Please report any bug on https://launchpad.net/products/medibuntu/+bugs
deb http://medibuntu.sos-sts.com/repo/ feisty free non-free
deb-src http://medibuntu.sos-sts.com/repo/ feisty free non-free

step3) 更新套件列表,安裝Adobe Reader
$ sudo apt-get update && sudo apt-get install acroread

step4.1) 下載繁體中文字型
http://www.adobe.com/products/acrobat/acrrasianfontpack.html下載
頁面選項版本請選擇Adobe Reader 7、Chinese Traditional、Linux如下圖所示

step4.2) 安裝中文字型
下載後解壓縮,進入解壓縮得到的資料夾,進行安裝
$ sudo ./INSTALL

會問你確定安裝?按y,按Enter鍵
會問接受授權?輸入accept,按Enter鍵
接下來問安裝路徑,複製貼上/usr/lib/Adobe/Acrobat7.0 ,按Enter鍵

PS. Ubuntu預設的文件檢視器本身就可以瀏覽PDF的檔案,不過對於有中文內容的文件就會發生字體被分解、支離破碎的問題。

2007-08-25

【Ubuntu】(for 64位元版本)讓ubuntu可以觀看wmv, mpg, rm, asx...等格式的影片

step1) 安裝gstreamer的解碼器
$ sudo apt-get install gstreamer0.10-ffmpeg gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse

step2) 安裝xine及解碼器
$ sudo apt-get install libxine-extracodecs totem-xine ffmpeg lame faad sox mjpegtools libxine-main1

step3) 安裝w32codecs
先把這一個伺服器位址http://packages.medibuntu.org/ feisty 加入sources.list清單,並且更新
$ echo "deb http://packages.medibuntu.org/ feisty free non-free" | sudo tee -a /etc/apt/sources.list
$ wget -q http://packages.medibuntu.org/medibuntu-key.gpg -O- | sudo apt-key add - && sudo apt-get update
接著就可以用apt-get輕鬆安裝了!
$ sudo apt-get install w64codecs

step4) 其他請參考【Ubuntu】讓ubuntu可以觀看wmv, mpg, rm, asx...等格式的影片

PS. 這在Ubuntu 7.04 64-bit上安裝成功,之前從64bit換回32bit就是w32decodecs搞不定,後來在網路上看到有阿肚仔說這解碼器for 64bit版本的套件名稱叫做w64decodecs,找了一下才發現Medibuntu已經提供Packages...,之前搞了好久的東西想不到只要幾個指令就簡單完成安裝了>"<

2007-08-11

【Ubuntu】安裝htop


  在網路上發現一個還滿不錯的系統資源監控軟體htop,跟top很像,不過他有樹狀的顯示功能、色彩分類顯示...等,感覺還滿不錯的。

$ sudo apt-get install htop

2007-08-07

【Ubuntu】關於開機ADSL自動連線的問題

  這個問題其實困擾我很久了,找了很多種解決方法:在作業階段加入pon dsl-provider指令、改變/etc/resolv.conf的inode資訊等,本來已經習慣開機手動連線了>"< 今天下午不知道哪來的動力又再一次嘗試這些解決方法,才發現自己是如此的豬頭,第一次找到的解決方法就是上上之道了...。

解決方法:
step0) 第一步往往是最重要的一步,要設定ADSL撥接相信大家都一樣很熟巧的知道要使用sudo pppoeconf指令了,重點是在設定的倒數第二步驟會詢問是否開機自動連線,這時候請選擇「否」,這個工作交給下面設定的作業階段自動連線就好,如果選「是」不知道什麼原因在domain name server的設定總會發生錯誤
step1) 點選「系統」→「偏好設定」→「作業階段」
step2) 在「初始啟動程式」頁面,點選「新增」
step3) 名稱隨意輸入(可以輸入有意義名稱比如:ADSL),重點是指令這裡要輸入pon dsl-provider,輸入完畢後點選「確定」就可以了

2007-08-04

【Ubuntu】Ubuntu之父:戴爾將擴大銷售Linux PC

Ref:Ubuntu之父:戴爾將擴大銷售Linux PC

Ubuntu版Linux創始人Mark Shuttleworth說,戴爾公司不久後將擴大銷售安裝Linux作業系統的個人電腦。

Shuttleworth也是Linux支援服務商Canonical公司的創辦人。他表示,戴爾5月間推出Linux PC後,市場需求不錯,令戴爾相當滿意。

戴爾是世界第二大PC製造商,銷售額僅次於惠普公司。目前戴爾對消費者供應五款採用Ubuntu Linux作業系統的PC。

Shuttleworth上周接受訪問時表示:「目前為止,戴爾所宣布的還不是全貌。未來幾個月,會陸續有更多款Linux PC上市。」

戴爾發言人Anne Camden拒絕評論,只重申戴爾對尚未發表的產品無可奉告。但她強調,戴爾對Linux PC引起的消費者迴響感到欣慰。

諸如Shuttleworth私人擁有的Canonical公司,以及Red Hat和Novell等公司,都靠銷售標準版Linux軟體以及附帶的支援服務獲利。

Shuttleworth表示,他所屬的公司除了與戴爾合作外,並未與惠普或其他名列前五大的PC製造商洽談隨機搭售Ubuntu的合作計畫。全球前五大PC製造商還包括聯想、宏碁與東芝。(唐慧文/譯)


順便貼一段在論壇上看到有位女網友對於選擇系統上的看法
hi.
我是。。。
為什麼會使用Ubuntu?=》
1.我已厭倦每買一PC或NB,就非得被迫買一次窗戶。我又不是要蓋房子,不過就一PC加一NB,有需要那麼多個窗戶嗎?
2.誰說電腦只有窗戶可以用?企鵝,大腳,紅帽子。。也都很可愛。
3.我不想再花時間去當海盜學破解序號,現在學會了,很快就不能用了。那我何必花時間去做無意義的事?寧可把時間花在Linux上,因為現在學會了,以後還是自己的知識。
4.我只是上上網,打打文件,沒事再看影片,聽音樂,何必拿一個龐然大物來找麻煩?
5.我只是一個月光族的上班族,沒有多$$,可以給M$,一天到晚要我升級,要我花$$。
6.我要過“有點硬”的人生,不想再過“有點軟”的生活。
使用感想是什麼?
爽。。爽。。爽。
對新手來說,真的不難學,陣痛期是一定有的,使用窗戶難道沒有陣痛期??你一定也有經過,只是你忘了。

  不知道為什麼,我很喜歡向人家推薦這套系統,大概時從上個學期開始吧!我開始慫恿身邊的人使用這套系統:建議阿拉把學會電腦伺服器都改成Ubuntu、建議阿宅就用Ubuntu的系統練習PHP、建議實驗室建構模擬環境採用Ubuntu+VirtualBox...,到最後自己家裡電腦也都是Ubuntu,或許真的是上手簡單,一開始自己是玩BSD的,對於Linux架構的系統並沒有多大興趣(雖然真的差異不大),不過BSD上Port Tree的好我一直覺得多數Linux始終無法匹敵,即便Fedora有yum...等,但就是不喜歡(這時要有小孩的稚氣,就是不喜歡!)直到Ubuntu的apt安裝架構,我相信可以是跳槽的時候了>"<
  尤其是安裝上的’舒適度’,我想是我目前看過安裝過程可以比windows還簡單的系統吧,雖然現在系統安裝都是’無腦下一步’。不過用Ubuntu還有一個超級大原因:我可以站在世界的中心呼喊->我電腦跑的軟體是正版的喔!雖然我以前用的OS也都已經買了版權...沒辦法,微軟總是喜歡脅迫PC業者強暴單純的消費者。
  屁話說一堆,只是希望讓看到這篇內容的人可以經我慫恿後一起加入Ubuntu的社群吧!

2007-08-02

【Ubuntu】安裝JVM

step1) 安裝JRE
$ sudo apt-get install sun-java6-jre

step2) 安裝java-plugin(讓firefox可以瀏覽需要jvm的網頁)
$ sudo apt-get install sun-java6-plugin


step3) 測試安裝是否成功
瀏覽網頁http://java.com/zh_TW/download/help/testvm.xml
如果能看到一個三角形的小玩偶在那邊揮手亂跑就表示成功了!

【Ubuntu】讓ubuntu可以觀看wmv, mpg, rm, asx...等格式的影片

64位元的使用者請看這篇:【Ubuntu】(for 64位元版本)讓ubuntu可以觀看wmv, mpg, rm, asx...等格式的影片

step1) 安裝gstreamer的解碼器
$ sudo apt-get install gstreamer0.10-pitfdll gstreamer0.10-ffmpeg gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse

step2) 安裝xine及解碼器
$ sudo apt-get install libxine-extracodecs totem-xine ffmpeg lame faad sox mjpegtools libxine-main1

step3) 安裝w32codecs
$ wget -c http://www.debian-multimedia.org/pool/main/w/w32codecs/w32codecs_20061022-0.0_i386.deb
$ sudo dpkg -i w32codecs_20061022-0.0_i386.deb


2007/08/04:
  裝玩以上的套件後就可以使用系統預設的影片播放軟體Totem看影片了,不過一定很使用者喜歡用mplayer吧!很多人應該跟我一樣照著wiki上的安裝步驟裝完mplayer以後卻無法用mplayer觀看影片,明明解碼的套件都已經正確安裝完畢,Totem可以順利播放而mplayer卻不行,後來求拜Google後發現是設定檔需要更改一些內容才行!請參考以下步驟:
step4.1) 安裝mplayer
$ sudo apt-get install mplayer
step4.2) 更改設定
$ sudo gedit /etc/mplayer/mplayer.conf
將#vo=xv這行的註解取消,也就是把#vo=xv改成vo=xv
step4.3) 把家目錄下的.mplayer目錄刪掉,下次開啟軟體時會自動重建(比自己慢慢改來的快XD)
$ rm -R .mplayer/
這樣mplayer就可以正常播放影片了!

  其實推薦使用mplayer還有個原因就是看影片的字幕亂碼簡單好處理啦!大家看影片弄到手的字幕編碼大部分都還是大五碼(BIG-5),不知道怎麼回事,在Totem調來調去都沒辦法正確的顯示字幕,mplayer就很簡單了!請參考下面的步驟:
step5.1) 在播放器中按右鍵,選擇Preferences選項,切到Subtitles & OSD頁面Encoding欄位選擇Traditional Chinese charset (BIG5)
step5.2) 在切換到Font頁面Font欄位填入/usr/share/fonts/truetype/arphic/ukai.ttf,這樣就大功告成啦!(如果這一步有問題應該只是你沒安裝這套字型,可以用Browser進到/usr/share/fonts目錄下選擇支援中文的自行就可以了)

【Ubuntu】安裝VirtualBox

  很多人對於Unix-like作業系統小有好奇心,最常見的作法莫過於在電腦上安裝windows系統(可能選擇Vista、XP、2000、或更舊的版本),然後再安裝虛擬機器(像是VirtualBox、VMware...等)藉此虛擬出一個子作業系統。

  上面的方法對於好奇Linux系統的初學者來說,可以說是最佳的作法,幾個月前我也是這樣玩的(畢竟不可能拿系上或實驗室的上線伺服器直接測試),隨著VirtualBox的成熟、穩定,終於讓我在一個月前決定反其道而行,把自家電腦主系統(Host-OS)安裝Ubuntu、子系統(Guess-OS)才用VirtualBox虛擬出來。

  這樣玩了將近一個月,我發現要戒掉windows的毒癮其實不難,把windows的操作環境毀掉其實就成功一半了!這意思是想告訴有心轉換作業系統的玩家:別擔心太多,殺了M$公司的作業系統,改安裝免錢、社群龐大的Ubuntu系統吧!如果你跟我一樣擔心毒癮偶爾會發作,就安裝VirtualBox來解決需求。

  感覺越來越像在賣藥...,安裝請參考下面步驟:

step1) 先安裝一些相依套件
$ sudo apt-get install libxalan110 libxerces27 build-essential linux-headers-`uname -r`
$ sudo apt-get install libqt3-mt

step2) 到http://www.virtualbox.org/wiki/Downloads下載最新套件(64位元電腦請下載AMD64)

step3) 安裝
$ sudo dpkg -i virtualbox_1.4.0-21864_Ubuntu_feisty_amd64.deb

step4) 將自己(允許可以使用VirtualBox的帳戶)加入vboxusers群組
$ sudo usermod -G vboxusers -a 你的帳號

step5) 重新登入系統後就可以開啟VirtualBox了!
開啟選單:應用程式 -> 系統工具 -> innotek VirtualBox

2007-07-29

好用的JavaScript Calendar

  製作網頁表單常常為了統一使用者輸入日期格式煩惱?一般都是用select標籤來限制使用者或使透過JavaScript檢查使用者輸入的格式是否正確,前幾天在網路上不小心撿到好康的程式(JavaScript Calendar)。
  JavaScrip Calendar讓你的網頁可以輕鬆的增加月曆讓使用者方便點選,月曆出現的方式也可以選擇彈跳出新視窗或用浮現在原頁面,選擇完畢後自動將日期填入對應的欄位中,其中日期產生格式也可以由你自訂,是一套十分靈活的JavaScript模組。
  參考原著網頁:http://www.dynarch.com/projects/calendar/

使用示範:
step1)  到http://www.dynarch.com/projects/calendar/下載最新版本
step2) 將下載回來的套件解壓縮丟入網頁目錄
step3) 下載範例網頁並將之跟解壓縮的資料夾放在同一層目錄中即可

更多進階使用方法:
  解壓縮後資料夾中英該有一個doc子資料夾,裡面有完整的使用說明!

2007-07-27

【Ubuntu】硬體檢視軟體

  系統本身的硬體檢視工具雖然顯示很詳盡的硬體資訊,不過分類上卻很亂,對一般人來說很多內容也都是多餘的。
  Sysinfo是一套比較輕巧,分類也很清楚的好軟體,顯示畫面如下:
安裝Sysinfo

$ sudo apt-get install sysinfo

軟體開啟路徑:應用程式 -> 系統工具 -> Sysinfo

2007-07-24

【Ubuntu】讓Ubuntu可以解RAR壓縮檔

step1) 先到http://www.rarlab.com/download.htm下載RAR for Linux

step2) 將下載回來的檔案解壓縮
   $ tar zxvf 檔名

step3) 把解壓縮得到的幾個檔案丟到/usr/local/bin目錄下就可以了
   $ sudo mv default.sfx rar rar_static unrar /usr/local/bin/

PS. 系統內的解壓縮軟體就可以正確解壓縮RAR檔!!


NEW

後來發現直接apt-get安裝unrar就可以了^^

$ sudo apt-get install unrar

2007-07-19

【Ubuntu】安裝phpSysInfo


phpSysInfo讓你可以透過網頁輕易觀察主機目前運行狀態: CPU、磁碟、網路...等使用狀況。

安裝phpSysInfo
$ sudo apt-get install phpsysinfo

開啟phpSysInfo網頁
http://你的ip/phpsysinfo

PS.系統必須能執行php

【Ubuntu】安裝Pure-FTPd搭配網頁管理使用者系統

安裝pure-ftpd with MySQL
$ sudo apt-get install pure-ftpd-mysql

切換到網頁目錄
$ cd /var/www

下載PureFTPd網頁管理系統(系統需支援PHP)
$ wget http://machiel.generaal.net/files/pureftpd/ftp_v2.1.tar.gz
(可以到http://machiel.generaal.net/查詢是否有新版的管理系統)

解壓縮下載的套件
$ tar zxvf ftp_v2.1.tar.gz

開啟瀏覽器, 輸入網址:
http://你的ip/ftp/install.php
接著照網頁提示依序完成每個步驟就可以了
最後會提示修改檔案mysql.conf
首先切換到檔案所在的目錄
$ cd /etc/pure-ftpd/db
先備份原先的設定檔
$ sudo mv mysql.conf mysql.conf.bak
將管理系統網頁step6頁面所提示要修改的內容全部複製起來
建立設定檔mysql.conf並貼上複製的內容
$ sudo vi mysql.conf

重新啟動Pure-FTPd伺服器
$ sudo pure-ftpd-control restart

開啟網頁編輯ftp使用者
http://你的ip/ftp
登入後即可管理ftp使用者

PS1.
出現錯誤 Checking if config.php is writable Failed!
  解決=>將ftp目錄下的config.php改為可寫入即可

PS2.
出現錯誤 Checking if PHP Extension MYSQL is enabled Failed!
  解決=>確定是否已安裝php5-mysql套件

PS3.
避免日後遭受駭客攻擊, 設定完畢後應該刪除ftp目錄下的install.php檔案

2007-07-14

【Ubuntu】安裝Apache-tomcat

安裝JAVA執行環境jre
sudo apt-get install sun-java5-jre

安裝JAVA開發套件jdk
sudo apt-get install sun-java6-jdk

網路上看到有人解釋下面這指令是:設置當前預設的java解釋器
sudo update-alternatives --config java
(選2, 選項中有sun字串者)

抓取tomcat套件(可以到http://tomcat.apache.org/download-60.cgi找最新套件)
wget http://apache.stu.edu.tw/tomcat/tomcat-6/v6.0.13/bin/apache-tomcat-6.0.13.tar.gz

移到/opt下
sudo mv apache-tomcat-6.0.13.tar.gz /opt/
cd /opt
sudo tar zxvf apache-tomcat-6.0.13.tar.gz
sudo mv apache-tomcat-6.0.13 tomcat

編輯檔案/etc/profile
sudo vi /etc/profile
加入以下敘述
export JAVA_HOME=/usr/lib/jvm/java-6-sun

啟動apache-tomcat
sudo /opt/tomcat/bin/startup.sh
如果出現以下指令, 則伺服器成功啟動!
Using CATALINA_BASE: /opt/tomcat
Using CATALINA_HOME: /opt/tomcat
Using CATALINA_TMPDIR: /opt/tomcat/temp
Using JRE_HOME: /usr/lib/jvm/java-6-sun

apache-tomcat預設開啟的服務port是8080
因此開啟網頁記得指定port, 參考下面格式
http://你的ip:8080

新增tomcat管理帳號
sudo vi /opt/tomcat/conf/tomcat-users.xml
<tomcat-users>≶/tomcat-users>之間加入以下敘述
<user username="用戶名" password="密碼" roles="admin,manager"></user>
再重新啟動apache-tomcat即可
sudo /opt/tomcat/bin/shutdown.sh
sudo /opt/tomcat/bin/startup.sh

即可點選http://你的ip:8080
左方選單Tomcat Manager項目進入管理伺服器

修改伺服器服務的port為80
sudo vi /opt/tomcat/conf/server.xml
找到<connector port="8080" protocol="HTTP/1.1"></connector>敘述
修改成<connector port="80" protocol="HTTP/1.1"></connector>
再重新啟動apache-tomcat即可
sudo /opt/tomcat/bin/shutdown.sh
sudo /opt/tomcat/bin/startup.sh

修改port為80後開啟網頁就不必另外指定port了
直接輸入網址及可
http://你的ip

【關鍵字:Ubuntu、Apache-tomcat、伺服器套件安裝、網頁伺服器】

2007-07-10

成熟

硬幹不是英雄,為生命找到出口才是成熟

  上星期,有一位大五延畢生來實驗室想坳成績,不過基於原則與公平還是拒絕他的任何理由、藉口,不知他哪來的勇氣竟然勇敢到打電話給老師,老師只好請他到實驗室來重新確認成績。

  狀況描述:
    。翹課兩週
    。小考只考10分
    。程式作業驗收表現中下

  我的評分項目有:出席、作業、小考、程式驗收,至少兩個項目均表現不佳,否則要被當是不可能的,在評分原則來說,我可以給分給得很鬆,但絕對不隨便!

  老師在他來實驗室之前有交代:人家是大五延畢生這學期要被退學了,等一下來的時候就把分數算給他看,口氣好一點,他已經沒有退路了,不要讓人家跑去自殺了...。

  一開始確實用很"和緩"的口氣把分數算一遍給他看,接著跟我坳說他只是遲到沒簽名,有一次缺課他有來,我實在很不能理解,沒簽到是我的錯嗎?!何況遲到一節課,第二堂有來補簽到我也都視為出席,還想跟我扯東扯西。

  接著扯說:我上課有宣布小考是拿來加分,所以他就隨便亂考?!小考拿來加分...我是說考試題目很簡單(其中30分試題內容也都透露了),考試是希望藉此來"提升"分數吧,這也跟我亂扯亂坳,沒後路就要這樣亂說話嗎?!連基本30分都不去掌握還想坳什麼成績。

  最後還質疑我成績比例,竟然說我小考比例不應該佔這麼高,我還真想請他來安排下學期課程好了。

  讓他在實驗室扯了一個小時,搞到最後實驗室學長都聽不下去,也加入戰場(感謝宏毅、文皓),這樣他還是繼續"ㄌㄨˊ",最後救星出現:老闆現身(背景閃亮亮),老闆眼見戰局進入白熱化,老闆親自開口"超渡"這位刀下亡魂。

  老闆嘴砲(不對,是口才)果然名不虛傳,再一次把成績分析給他聽一次,此時他當然繼續把剛剛說詞一一重複,老闆也一一還擊並且很厲害的把戰局移到轉學考,提供另一條生路給他選擇,此時老闆說出:成績是這學期的表現評量,現在你只能選擇繼續怨天尤人或是幫自己找一條出路,給自己另一個機會,這才是成熟的表現。

  老闆就這樣拍著那迷途羔羊的肩膀,將之送出實驗室。

  我把老闆的話改成「硬幹不是英雄,為生命找到出口才是成熟」,這事件看來我似乎沒錯,不過當老闆提到成熟這點,我知道我應該有所反省,雖然成績事實是如此,我雖然沒做任何私自調分的惡行,不過我應該要放大格局,除了在成績上讓人心服口服,也應該要有能力適時提出其他機會給予參考,如此或許就能得到雙贏吧!?

2007-07-04

【遞迴】字串的排列組合

問題:
假若給一字串abc , 寫一程式能夠印出其所有的排列組合
abc acb bac bca cba cab

想法:
n為字串長度
讓所有字元皆出現在第n位置一次
abc
acb
cba
接著分n組個別探討,此時第n位置已固定
m為剩下字元,讓剩下所有字元皆出現在第m位置一次

依此類推,當n為1時直接印出字串,即完成。

用C語言實作:

#include <stdio.h>

void p(char *str, int n) {
char ch ;
int i ;
if(n==1) {
printf("%s\n", str) ;
}
else {
for(i=n-1 ; i>=0 ; i--) {
ch = *(str+i) ;
*(str+i) = *(str+n-1) ;
*(str+n-1) = ch ;
p(str, n-1) ;
ch = *(str+i) ;
*(str+i) = *(str+n-1) ;
*(str+n-1) = ch ;
}
}
}

int main() {
char ch[] = "abcd" ;
p(ch, 4) ;
system("pause") ;
return 0 ;
}

【關鍵字:字串排列組合、Permutation、遞迴】