日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

汇编语言随笔(14)-直接定址表、检测点16和实验16

發布時間:2025/6/17 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编语言随笔(14)-直接定址表、检测点16和实验16 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

標號

??????1,關于地址標號a:,帶有冒號的形式,之前我們一直使用。這種標號被用來標記指令,數據的起始地址,表示內存單元的起始地址。
??????后面帶有冒號的地址標號,只能在代碼段中使用,不能在其他段中使用。
??????例:將code段中a標號處的8個字節數據累加到b標號處的字中。

assume cs:codecode segmenta: db 1,2,3,4,5,6,7,8b: dw 0start: mov si,offset amov bx,offset bmov cx,8s: mov al,cs:[si]mov ah,0add cs:[bx],axinc siloop smov ax,4c00hint 21hcode endsend start

??????2,還有一種標號我們稱為數據標號a,不帶冒號的形式。不但可以表示內存單元的地址,還表示了內存單元的長度,即表示在此標號處的單元是一個字節單元,還是字單元,還是雙字單元。
??????這種不帶冒號的標號,除了可以在代碼段中使用,更常被使用于數據段中
??????例:同樣功能的代碼示例如下:

assume cs:codecode segmenta db 1,2,3,4,5,6,7,8b dw 0start: mov si,0mov cx,8s: mov al,a[si]mov ah,0add b,axinc siloop smov ax,4c00hint 21hcode endsend start

??????在 code 段中使用的標號:標號a,描述了地址code:0,和從這個地址開始,以后的內存單元都是字節單元;而標號b,描述了地址code:8,和從這個地址開始,以后的內存單元都是字單元。所以這種標號在指令可以代表一個段中的內存單元。單純的 b (相當于 b[si],其中 si 為0)表示地址在 cs:[8] 處的一個字單元。類似的,a[si] 表示在地址 cs:0[si] 處的一個字節單元中,標號在哪個段中,那么標號所表示的內存單元的段地址就為相應的段寄存器(如 cs,ds…)。括號內的偏移量必須為 bx、si、di 和 bp中的一個。

檢測點16.1

??????將code段中a處的8個數據累加,結果存儲到b處的雙字中:

assume cs:codecode segmenta dw 1,2,3,4,5,6,7,8b dd 0start: mov si,0mov cx,8s: mov ax,a[si]add word ptr b[0],ax ;需要顯式指定運算對象為字單元adc word ptr b[2],0add si,2loop smov ax,4c00hint 21hcode endsend start

??????3,在其他段(數據段)中使用數據標號的情況。簡而言之,使用數據標號時必須將它所在的段與某一個段寄存器相關聯,并且在程序中需要用指令對該段寄存器進行設置。

assume cs:code ds:data ;1,將ds和數據標號所在段相關聯data segmenta db 1,2,3,4,5,6,7,8b dw 0data endscode segmentmov ax,data ;2,這兩句是將data段地址存放到ds中。mov ds,ax;下面就可以正常使用數據標號了mov si,0mov cx,8s: mov al,a[si]mov ah,0add b,axinc siloop smov ax,4c00hint 21hcode endsend start

??????使用數據標號的特殊情況:

data segmenta db 1,2,3,4,5,6,7,8b dw 0c dw a,b ;等同于 c dw offset a,offset bd dd a,b ;等同于 d dw offset a,seg a,offset b,seg bdata ends

??????在 c 標號處存儲的兩個字型數據是 標號a、b 的偏移地址。在 d 標號處存儲的兩個雙字型數據為標號 a 的偏移地址、段地址和標號 b 的偏移地址、段地址。 seg 操作符為取得某一標號的段地址。

直接定址表

??????編寫一個子程序:計算 sin(x),其中 x ∈{0,30,60,90,120,150,180},單位為度。并將結果顯示在屏幕上。如 sin(90)=1,sin(30)=0.5。
??????思路:如果要具體計算某個角度的 sin 值時,需要采用麥克勞林公式,計算非常費時。對于這 7 個角度,我們可以直接計算出它們的 sin 值并存儲到一張表中,用空間來換取時間,對于給定的一個角度,通過查表就可以得到它的 sin 值了。
??????子程序如下,其中 ax 來向子程序傳遞角度:

showsin: jmp short showtable dw ag0,ag30,ag60,ag90,ag120,ag150,ag180 ag0 db'0',0 ;sin 0=0ag30 db '0.5',0 ;sin 30=0.5ag60 db '0.866',0 ;sin 60=0.866ag90 db '1',0ag120 db '0.866',0ag150 db '0.5',0ag180 db '0',0show: push bxpush espush simov bx,0b800hmov es,bx;計算出sin(x)對應結果字符串的偏移地址mov bl,30div bl ;用角度值/30來得到相對于table的偏移mov bl,almov bh,0add bx,bx ;因為table中是字單元,需要再乘2mov bx,table[bx] ;bx中是對應結果字符串的偏移地址;顯示對應結果字符串到屏幕mov si,160*12+40*2shows: mov ah,cs:[bx]cmp ah,0je showretmov es:[si],ahinc bxadd si,2jmp short showsshowret: pop si pop espop bxret

??????像這種可以通過依據數據,直接計算出所要找的元素的位置的表,稱其為直接定址表
??????如果在直接定址表中存儲子程序的地址,這樣就可以方便地實現不同子程序的調用,這是直接定址表最常見的一種用法。下面通過實驗16來具體說明。

實驗16

??????編寫包含多個功能子程序的中斷例程:安裝一個新的 int 7ch 中斷例程,為顯示輸出提供如下功能子程序。
(1)清屏:
(2)設置前景色
(3)設置背景色
(4)向上滾動一行
??????入口參數說明:用 ah 寄存器傳遞功能號:0表示清屏,1表示設置前景色,2表示設置背景色,3表示向上滾動一行;??????對于1、2號功能,用al來傳送顏色值,(al)∈{0,1,2,3,4,5,6,7}。

assume cs:codecode segment;安裝程序在內存0:200h處start: mov ax,0mov es,axmov di,200hmov ax,csmov ds,axmov si,offset int7chcldmov cx offset int7chend-offset int7chrep movsb;修改中斷向量表mov word ptr es:[7c*4],200hmov word ptr es:[7c*4+2],0mov ax,4c00hint 21hint7ch: jmp short bodytable dw sub0,sub1,sub2,sub3 body: push bxcmp ah,3ja int7chretmov bl,ahmov bh,0add bx,bxcall word ptr table[bx]int7chret: pop bxiret;清屏,用空格符填滿整個屏幕sub0: push espush dipush cxmov di,0b800hmov es,dimov di,0mov cx,2000b: mov byte ptr es:[di],' 'add di,2loop bpop cxpop dipop esret;設置前景色sub1: push dipush espush cxmov di,0b800hmov es,dimov di,1mov cx,2000c: and byte ptr es:[di],11111000bor es:[di],aladd di,2loop cpop cxpop espop diret;設置背景色sub2: push dipush espush cxmov di,0b800hmov es,dimov di,1mov cl,4shl al,clmov cx,2000d: and byte ptr es:[di],10001111bor es:[di],aladd di,2loop dpop cxpop espop diret;向上滾動24行,最后一行用空格符清楚sub3: push dspush espush sipush dipush cxmov si,0b800hmov ds,simov es,simov di,0mov si,160mov cx,24clde: push cxmov cx,160rep movsbpop cxloop emov cx,80mov di,160*24f: mov byte ptr es:[di],' 'add di,2loop fpop cxpop dipop sipop espop dsretint7chend: nopcode endsend start

總結

以上是生活随笔為你收集整理的汇编语言随笔(14)-直接定址表、检测点16和实验16的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。