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

3 則留言:

日落 Zero 提到...

這邊是考古題專區嗎?乾脆我DB期末專題寫出來給你用好了 @@

匿名 提到...

請問該如何反轉字串??
我都試不起來...
怪怪ㄉ..

Ronald 提到...

你的問題應該單回一圈就可以解決
不過得有問題的詳細規格~
才好說明吧XD