cpu在順序執行程式片時,按照指令先後次序執行指令,因此在順序程式中,指令先後次序至關重要。
例:將一位元組壓縮bcd轉換為兩個ascii碼
data segment例:把乙個16進製制數字碼轉換為對應7段**程式。bc_buf db 96h
asc_buf db 2 dup(?)
data ends
code segement
assume cs: code, ds: data
start: mov ax, data
mov ds, ax
mov al, bcd_buf
mov bl, al
mov cl, 4
shr al, cl
add al, 30h
mov asc_buf, al
and bl, 0fh
add bl, 30h
mov asc_buf + 1, bl
code ends
end start
xlat:該指令暫存器bx內容作為表(每項乙個位元組)的首位址,把暫存器al值作為下標,取出表項內容,內容再送al暫存器,也就是把暫存器al中的內容轉換為表中對應項的值。表最大為256項。
dseg segment
tab db 1000000b, 1111001b, 0100100b, 0110000bdseg endsdb 0011001b, 0010010b, 0000010b, 1111000b
db 0000000b, 0010000b, 0001000b, 0000011b
db 1000110b, 0100001b, 0000110b, 0001110b
xcode db 8
ycode db ?
cseg segment
assume cs: dseg, ds: dsegstart: mov ax, dseg
mov ds, axcseg endsmov bx, offset tab
mov al, xcode
and al, 0fh
xlat
mov ycode, al
mov ah, 4ch
int 21h
end start
data segment
tab db 0,1,4,9,16,25,36,49,65,81,100,121,144,169,196,225data endsa db 12
b db ?
code segment
assume cs: code, ds: datastart: mov ax, data
mov ds, axend startmov bx, offset tab
mov al, a
xlat
mov b, al
code ends
在組合語言中,一般利用條件測試指令和條件轉移指令等實現簡單的分支。
例:比較兩個無符號數的大小,把大數存入max單元
data segment
source db x1, x2data endsmax db ?
code segment
assume cs: code, ds: dataendmov ax, data
mov ds, ax
mov al, source
cmp al, source+1
jnc one ;若沒借位
mov al, source+1
one: mov max, al
code ends
例:由大到小排列三個數
datas segment
buffer db 87, 234, 123datas ends
codes segment
assume cs: codes, ds: datasstart: mov ax, datas
mov ds, axend startmov si, offset buffer
mov al, [si]
mov bl, [si+1]
mov cl,, [si+2]
cmp al, bl
jae next1
xchg al, bl
next1: cmp al, cl
jae next2
xchg al, cl
next2: cmp bl, cl
jae next3
xchg bl, cl
next3: mov [si], al
mov [si+1], bl
mov [si+2], cl
int 21h
codes ends
迴圈通常由四部分組成:
(1)初始化部分
(2)迴圈體部分
(3)調整部分
(4)控制部分
例:在字元陣列裡找出第乙個非0資料,並顯示輸出其所在陣列的下標
data segment
array db 0,0,016,0,88,66,0,44,33,99
count equ $-array
data ends
code segment
assume cs:code, ds:data
start:mov ax, data
mov ds, ax
mov cx, count
mov di, –1
again:
inc di
cmp array[di], 0
loopz again
mov dx, di
or dl, 30h ;轉換為ascii
display:
mov ah, 02h
int 21h
mov ah, 4ch
int 21h
code ends
end start
例:把字串所有大寫字母改為小寫字母,設字串以結尾。
data segment
str db 『how are u !』, 0
data ends
code segment
assume cs:code, ds: data
start:
mov ax, data
mov ds, ax
mov si, offset str
again:
mov al, [si]
or al, al ;測試是否為0
jz ok
cmp al, 『a』
jb next
cmp al, 『z』
ja next
or al, 20h ;加20h
next:
inc si
nmp again
ok:mov ax, 4c00h
int 21h
code ends
end start
80x86儲存器組織結構
概括 本文介紹80x86儲存器組成的基本原理,會隱藏一些硬體細節。一 基本組成 1.1 計算機系統由cpu,memory,i o組成,如下圖,時鐘驅動cpu處理 讀 寫 運算 memory裡的程式或者資料,以及控制i o。1.2 當然現的計算機系統不會如此簡單,因為memory有很多種,i o裝置的...
80X86學習筆記 轉移指令
無條件段內直接轉移指令格式 jmp 標號 使控制無條件的轉移到標號位址。例 next mov ax,cx jmp next jmp over over mov ax,1 在執行無條件段內轉移指令時,實際操作是把指令中的位址差加到指令指標ip上,使ip內容為目標位址,從而達到轉移目的。段內無條件直接轉...
80X86計算機組織
2 實體地址 16 段位址 偏移位址 3 處理器 cpu組成 算術邏輯部件alu 控制器 暫存器 8086 8088暫存器組 資料暫存器 ax,bx,cx,dx 指標及變址暫存器 sp,bp,si,di 段暫存器 cs,ds,ss,es 控制暫存器 ip,flags 標誌暫存器 flags,又稱程式...