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