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

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

汇编中数据处理的基本问题

發(fā)布時(shí)間:2025/3/15 编程问答 15 豆豆
生活随笔 收集整理的這篇文章主要介紹了 汇编中数据处理的基本问题 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

在8086CPU中只有 bx、si、di、和bp可以使用[…]來(lái)進(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ò)誤的:

mov ax,[cx] mov ax,[ax] mov ax,[dx] mov ax,[ds]

但是這四個(gè)也不是隨便使用的,必須有相應(yīng)的搭配才能使用
只有四種組合:bx和si,bx和di,bp和si,bp和di
如下下面的是錯(cuò)誤的

mov ax,[bx+bp] mov ax,[si+di]

只要在[…]使用了bp,而指令中沒(méi)有西顯性的給出段地址,段地址就默認(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ī)器指令這一層來(lái)說(shuō)并不關(guān)心數(shù)據(jù)值的多少,而是關(guān)心指令執(zhí)行前一刻,它將要處理的數(shù)據(jù)所存放的位置,執(zhí)行指令之前多要處理的數(shù)據(jù)可以在三個(gè)地方:

  • CPU內(nèi)部
  • 內(nèi)存
  • 端口
mov bx,[0] ;內(nèi)存,ds:0單元 mov bx,ax ;CPU內(nèi)部,ax寄存器 mov bx,1 ;CPU內(nèi)部,指令緩存器

匯編語(yǔ)言中數(shù)據(jù)位置的表達(dá)

  • 立即數(shù)
  • 對(duì)于直接包含在機(jī)器指令中的數(shù)據(jù)(執(zhí)行前在CPU的指令緩存器中,在匯編語(yǔ)言中稱為:立即數(shù)(idata)),在匯指令中直接給出。

    mov bx,1 add bx,2000h
  • 寄存器
    指令要處理的數(shù)據(jù)在寄存器中,在匯編指令中給出相應(yīng)的寄存器名字。
  • mov ax,bx mov ds,ax push bx mov ds:[0],bx mov ss,ax
  • 段地址(SA)和偏移地址(EA)
    指令要處理的數(shù)據(jù)在內(nèi)存中,在匯編指令中可以使用[X]的格式給出EA,SA在某個(gè)段寄存器中;
    存放段地址的寄存器是默認(rèn)的:
    例如:
  • mov ax,[0] mov ax,[di] mov ax,[bx+8] mov ax,[bx+si] mov ax,[bx+si+8]

    等指令,段地址默認(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í)候,我們可以用多種方式來(lái)給定這個(gè)內(nèi)存單元的便宜地址,這種定位內(nèi)存單元的方法一般成為尋址方式。

  • 通過(guò)寄存器指明要處理數(shù)據(jù)的數(shù)據(jù)尺寸
  • mov ax,1 mov al,1

    ##就是##
    2. 在沒(méi)有寄存器的存在的情況下,使用操作符X ptr 指明內(nèi)存單元的長(zhǎng)度,X在匯編指令中可以為word或byte。
    例如:用word ptr指明了指令訪問(wèn)的內(nèi)存單元是一個(gè)字單元

    mov word ptr ds:[0],1 inc word ptr [bx]

    下面的指令中,用byte ptr指明指令訪問(wèn)的內(nèi)存單元是一個(gè)字節(jié)單元:

    mov byte ptr ds:[0],1 inc byte ptr ds:[0] inc byte ptr [bx]
  • 其它的方法
    有些指令默認(rèn)了只能訪問(wèn)的是字單元還是字節(jié)單元,比如,push [1000H]就不用指明訪問(wèn)的是字單元還是字節(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ù) 被除數(shù) 8位 16位(AX) 16位 32位(DX+AX)

    為什么除數(shù)是8位,被除數(shù)是16位但是除數(shù)是16位的時(shí)候被除數(shù)是32位 因?yàn)槭鞘褂贸朔M的除法 因此在進(jìn)行的過(guò)程中存在溢出要保證精度必須被除數(shù)的位數(shù)大于除數(shù)的位數(shù)這樣才能盡量的保證解雇的精度夠用
    div指令的格式:

    div reg div 內(nèi)存單元 div byte ptr ds:[0] 含義:(al) = (ax)/((ds)*16 + 0)的商(ah) = (ax)/((ds)*16 + 0)的余數(shù) div word ptr [bx+si+8] 含義:(ax) = [(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)的商(dx) = [(dx)*10000H+(ax)]/((ds)*16+(bx)+(si)+8)的余數(shù)解釋:因?yàn)楫?dāng)被除數(shù)是32位的時(shí)候,要在DX中存放高16位在,AX中存放低16位,因此在DX中的實(shí)際值是是DX中值的10000H倍,也就相當(dāng)于向左移16位;

    編程實(shí)例:

    利用除法指令計(jì)算 100001/100
    移位100001大于65535,因此被除數(shù)大于16位要使用32位的被除數(shù),所以只能使用DX和AX兩個(gè)寄存器聯(lián)合存放100001,也就是說(shuō)要進(jìn)行16位除法,雖然除數(shù)100小于255但是由于被除數(shù)是32位的因此除數(shù)應(yīng)該放在16位的寄存器中;
    100001換成16進(jìn)制的是186A1H因此程序如下:

    mov dx,1 mov ax,86A1H ;(dx)*10000H+(ax)=100001 mov bx,100 div bx

    偽指令dd

    dd是用來(lái)定義一個(gè)dword(double word)雙字型數(shù)據(jù)
    例如:

    data segmentdb 1 ;字節(jié) bytedw 1 ;字 worddd 1 ;雙字 double word

    使用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的處理過(guò)程:

    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è)操作符,在匯編語(yǔ)言中同db、dw、dd等一樣,也是由匯編器識(shí)別處理的符號(hào)。它是和db、dw、dd等數(shù)據(jù)定義的偽指令配合使用,用來(lái)進(jìn)行數(shù)據(jù)的重復(fù);
    例如:

    db 3 dup (0) ;定義3個(gè)字節(jié),它們的值都是0,相當(dāng)于 db 0,0,0 db 3 dup (0,1,2) ;定義9個(gè)字節(jié),它們的值是0,1,2,0,1,2,0,1,2相當(dāng)于 db 0,1,2,0,1,2,0,1,2 db 3 dup ('abc','ABC') ;定義18個(gè)字節(jié),它們的值是'abcABCabcABCabcABC'相當(dāng)于 db 'abcABCabcABCabcABC'

    可見,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,使程序變得簡(jiǎn)短一些,但是如果定義一個(gè)容量為1000字節(jié)或10000字節(jié)這時(shí)候再一個(gè)一個(gè)定義就顯得很吃力了這時(shí)使用dup可以輕松的搞定。如下:

    stack segment db 200 dup (0) stack ends

    6

    總結(jié)

    以上是生活随笔為你收集整理的汇编中数据处理的基本问题的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

    如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。