80X86學習筆記 源程式組織

2022-03-27 14:55:17 字數 3879 閱讀 1879

cpu在順序執行程式片時,按照指令先後次序執行指令,因此在順序程式中,指令先後次序至關重要。

例:將一位元組壓縮bcd轉換為兩個ascii碼

data segment

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

例:把乙個16進製制數字碼轉換為對應7段**程式。

xlat:該指令暫存器bx內容作為表(每項乙個位元組)的首位址,把暫存器al值作為下標,取出表項內容,內容再送al暫存器,也就是把暫存器al中的內容轉換為表中對應項的值。表最大為256項。

dseg segment

tab db 1000000b, 1111001b, 0100100b, 0110000b

db 0011001b, 0010010b, 0000010b, 1111000b

db 0000000b, 0010000b, 0001000b, 0000011b

db 1000110b, 0100001b, 0000110b, 0001110b

xcode db 8

ycode db ?

dseg ends

cseg segment

assume cs: dseg, ds: dseg

start: mov ax, dseg

mov ds, ax

mov  bx, offset tab

mov al, xcode

and al, 0fh

xlat

mov ycode, al

mov ah, 4ch

int 21h

cseg ends

end start

data segment

tab db 0,1,4,9,16,25,36,49,65,81,100,121,144,169,196,225

a db 12

b db ?

data ends

code segment

assume cs: code, ds: data

start: mov ax, data

mov ds, ax

mov bx, offset tab

mov al, a

xlat

mov b, al

code ends

end start

在組合語言中,一般利用條件測試指令和條件轉移指令等實現簡單的分支。

例:比較兩個無符號數的大小,把大數存入max單元

data segment

source db x1, x2

max db ?

data ends

code segment

assume cs: code, ds: data

mov ax, data

mov ds, ax

mov al, source

cmp al, source+1

jnc one   ;若沒借位

mov al, source+1

one: mov max, al

code ends

end

例:由大到小排列三個數

datas segment

buffer db 87, 234, 123

datas ends

codes segment

assume cs: codes, ds: datas

start: mov ax, datas

mov ds, ax

mov 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

end start

迴圈通常由四部分組成:

(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,又稱程式...