汇编中数据处理的基本问题
在8086CPU中只有 bx、si、di、和bp可以使用[…]來進(jìn)行尋址比如;
mov ax,[bx] mov ax,[bx+si] mov ax,[bx+di] mov ax,[bp] mov ax,[bp+si] mov ax,[bp+di]都是正確的
但是下面的指令都是錯(cuò)誤的:
但是這四個(gè)也不是隨便使用的,必須有相應(yīng)的搭配才能使用
只有四種組合:bx和si,bx和di,bp和si,bp和di
如下下面的是錯(cuò)誤的
只要在[…]使用了bp,而指令中沒有西顯性的給出段地址,段地址就默認(rèn)在ss中。比如如下的指令。
mov ax,[bp] ;含義:(ax) = ((ss)*16 + (bp)) mov ax,[bp+idata] ;含義:(ax) = ((ss)*16 + (bp) + idata)機(jī)器指令處理數(shù)據(jù)在什么地方
絕大多數(shù)機(jī)器指令都是進(jìn)行數(shù)據(jù)處理的指令,處理大致 可以分為3類:讀取、寫入、運(yùn)算,在機(jī)器指令這一層來說并不關(guān)心數(shù)據(jù)值的多少,而是關(guān)心指令執(zhí)行前一刻,它將要處理的數(shù)據(jù)所存放的位置,執(zhí)行指令之前多要處理的數(shù)據(jù)可以在三個(gè)地方:
- CPU內(nèi)部
- 內(nèi)存
- 端口
匯編語言中數(shù)據(jù)位置的表達(dá)
對(duì)于直接包含在機(jī)器指令中的數(shù)據(jù)(執(zhí)行前在CPU的指令緩存器中,在匯編語言中稱為:立即數(shù)(idata)),在匯指令中直接給出。
mov bx,1 add bx,2000h指令要處理的數(shù)據(jù)在寄存器中,在匯編指令中給出相應(yīng)的寄存器名字。
指令要處理的數(shù)據(jù)在內(nèi)存中,在匯編指令中可以使用[X]的格式給出EA,SA在某個(gè)段寄存器中;
存放段地址的寄存器是默認(rèn)的:
例如:
等指令,段地址默認(rèn)是ds中;
mov ax,[bp] mov ax,[bp+8] mov ax,[bp+8] mov ax,[bp+si] mov ax,[bp+si+8]等指令,段地址默認(rèn)是在ss中;
尋址方式
當(dāng)數(shù)據(jù)存放在內(nèi)存的時(shí)候,我們可以用多種方式來給定這個(gè)內(nèi)存單元的便宜地址,這種定位內(nèi)存單元的方法一般成為尋址方式。
##就是##
2. 在沒有寄存器的存在的情況下,使用操作符X ptr 指明內(nèi)存單元的長度,X在匯編指令中可以為word或byte。
例如:用word ptr指明了指令訪問的內(nèi)存單元是一個(gè)字單元
下面的指令中,用byte ptr指明指令訪問的內(nèi)存單元是一個(gè)字節(jié)單元:
mov byte ptr ds:[0],1 inc byte ptr ds:[0] inc byte ptr [bx]有些指令默認(rèn)了只能訪問的是字單元還是字節(jié)單元,比如,push [1000H]就不用指明訪問的是字單元還是字節(jié)單元,因?yàn)閜ush指令只能對(duì)字進(jìn)行操作。
討論一下div指令
div (division);
除數(shù):8位或16位,在寄存器或內(nèi)存單元中
被除數(shù):(默認(rèn))放在AX或DX和AX中
如果是8位,被除數(shù)則為16位,默認(rèn)在AX中存放,如果除數(shù)是16位,被除數(shù)為32位,在DX和AX中存放,DX中存放高16位,AX中存放低16位。
結(jié)果是:如果出事是8位,則AL存儲(chǔ)除法操作的商,AH存儲(chǔ)除法操作的余數(shù);如果是16位,則AX存儲(chǔ)除法操作的商,DX存儲(chǔ)除法操作的余數(shù)。
為什么除數(shù)是8位,被除數(shù)是16位但是除數(shù)是16位的時(shí)候被除數(shù)是32位 因?yàn)槭鞘褂贸朔M的除法 因此在進(jìn)行的過程中存在溢出要保證精度必須被除數(shù)的位數(shù)大于除數(shù)的位數(shù)這樣才能盡量的保證解雇的精度夠用
div指令的格式:
編程實(shí)例:
利用除法指令計(jì)算 100001/100
移位100001大于65535,因此被除數(shù)大于16位要使用32位的被除數(shù),所以只能使用DX和AX兩個(gè)寄存器聯(lián)合存放100001,也就是說要進(jìn)行16位除法,雖然除數(shù)100小于255但是由于被除數(shù)是32位的因此除數(shù)應(yīng)該放在16位的寄存器中;
100001換成16進(jìn)制的是186A1H因此程序如下:
偽指令dd
dd是用來定義一個(gè)dword(double word)雙字型數(shù)據(jù)
例如:
使用div計(jì)算data段中的第一個(gè)數(shù)據(jù)除以第二個(gè)數(shù)據(jù)后的結(jié)果,商存在第三個(gè)數(shù)據(jù)的存儲(chǔ)單元中
數(shù)據(jù)結(jié)構(gòu):
data segmentdd 100001dw 100dw 0 data ends使用div的處理過程:
mov ax,data mov ds,ax mov ax,ds:[0] mov dx,ds:[2] div word ptr ds:[4] mov ds:[6],ax偽指令dup
dup是一個(gè)操作符,在匯編語言中同db、dw、dd等一樣,也是由匯編器識(shí)別處理的符號(hào)。它是和db、dw、dd等數(shù)據(jù)定義的偽指令配合使用,用來進(jìn)行數(shù)據(jù)的重復(fù);
例如:
可見,dup的使用格式如下:
db 重復(fù)的次數(shù) dup (重復(fù)的字節(jié)型數(shù)據(jù)) dw 重復(fù)的次數(shù) dup (重復(fù)的字型數(shù)據(jù)) dd 重復(fù)的次數(shù) dup (重復(fù)的雙字型數(shù)據(jù))dup是一個(gè)很有用的操作符,比如定義一個(gè)容量為200字節(jié)的棧段,如果不用dup則必須使用:
stack segmentdw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0dw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 stack ends當(dāng)然,你可以使用dd,使程序變得簡短一些,但是如果定義一個(gè)容量為1000字節(jié)或10000字節(jié)這時(shí)候再一個(gè)一個(gè)定義就顯得很吃力了這時(shí)使用dup可以輕松的搞定。如下:
stack segment db 200 dup (0) stack ends6
總結(jié)
以上是生活随笔為你收集整理的汇编中数据处理的基本问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2018第二届数据科学家大会,诚邀您的参
- 下一篇: 作者:曾春秋,男,美国佛罗里达国际大学计