溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

《匯編語言》總結(jié)04 —— 更靈活的定位內(nèi)存地址的方法

發(fā)布時間:2020-04-04 19:07:53 來源:網(wǎng)絡(luò) 閱讀:880 作者:凡凡不會玩 欄目:開發(fā)技術(shù)

(一)and和or指令

  1. and指令:邏輯與指令,按位進行與運算

    mov al,01100011B

    and al,00111011B

    執(zhí)行后,al=00100011B

    作用:通過該指令可將操作對象的相應(yīng)位設(shè)為0,其他位不變。

  2. or指令:邏輯或指令,按位進行或運算

    mov al,01100011B

    or al,00111011B

    執(zhí)行后:al=011111011B

    作用:通過該指令可將操作對象的相應(yīng)位設(shè)為1,其他位不變。

(二)關(guān)于ASCII碼

世界上有很多編碼方案,有一種方案叫做ASCII編碼,是在計算機系統(tǒng)中通常被采用的。簡單地說,所謂編碼方案,就是一套規(guī)則,它約定了用什么樣的信息來表示現(xiàn)實對象。比如說,在ASCII編碼方案中,用61H表示“a”,62H表示“b”。一種規(guī)則需要人們遵守才有意義。

一個文本編輯過程中,就包含著按照ASCII編碼規(guī)則進行的編碼和解碼。在文本編輯過程中,我們按一下鍵盤的a鍵,就會在屏幕上看到“a”。這是怎樣一個過程呢?我們按下鍵盤的a鍵,這個按鍵的信息被送入計算機,計算機用ASCII碼的規(guī)則對其進行編碼,將其轉(zhuǎn)化為61H存儲在內(nèi)存的指定空間中;文本編輯軟件從內(nèi)存中取出61H,將其送到顯卡的顯存中;工作在文本模式下的顯卡,用ASCII碼的規(guī)則解釋顯存中的內(nèi)容,61H被當(dāng)作字符“a”,顯卡驅(qū)動顯示器,將字符“a”的圖像畫在屏幕上。

(三)以字符形式給出的數(shù)據(jù)

我們可以在匯編程序中,用'...'的方式指明數(shù)據(jù)是以字符的形式給出的,編譯器將把它們轉(zhuǎn)化為相對應(yīng)的ASCII碼,如下:

assume cs:code,ds:data

data segment

  db 'unIX'

  db 'foRK'

data ends

code segment

  start:mov al,'a'

      mov bl,'b'

      mov ax,4c00h

      int 21h

code ends

end start

《匯編語言》總結(jié)04 —— 更靈活的定位內(nèi)存地址的方法

(四)大小寫轉(zhuǎn)換問題

assume cs:codesg,ds:datasg

datasg segment

  db 'BaSiC'

  db 'iNfOrMaTiOn'

datasg ends

codesg segment

 start:mov ax,datasg

     mov ds,ax        ;設(shè)置ds指向datasg段

     mov bx,0         ;設(shè)置(bx)=0,ds:bx指向'BaSiC'的第一個字母

     mov cx,5         ;設(shè)置循環(huán)次數(shù)5,因為'BaSiC'有5個字母

  s:  mov al,[bx]        ;將ASCII碼從ds:bx所指向的單元中取出

     add al,11011111B     ;將al中的ASCII碼的第5位置為0,變?yōu)榇髮懽帜?/p>

     mov [bx],al        ;將轉(zhuǎn)變后的ASCII碼寫回原單元

     inc bx          ;(bx)加1,ds:bx指向下一個字母

     loop s

     mov bx,5         ;設(shè)置(bx)=5,ds:bx指向'iNfOrMaTiOn'的第一個字母

     mov cx,11        ;設(shè)置循環(huán)次數(shù)11,因為'iNfOrMaTiOn'有11個字母

 s0:  mov al,[bx]

     or al,00100000B     ;將al中的ASCII碼的第5位置為1,變?yōu)樾懽帜?/p>

     mov [bx],al

     inc bx

     loop s0

     mov ax,4c00h

     int 21h

codesg ends

code start

(五)[bx+idata]

在前面總結(jié)中,我們用[bx]的方式來指明一個內(nèi)存單元,還可以用一種更為靈活的方式來指明內(nèi)存單元:[bx+idata]表示一個內(nèi)存單元,它的偏移地址為(bx)+idata,比如:

mov ax,[bx+200]

數(shù)學(xué)化的描述為:(ax)=((ds)*16+(bx)+200)

也可以寫為:

mov ax,[200+bx]

mov ax,200[bx]

mov ax,[bx].200

那這種方式有什么用呢?我們可以用[bx+idata]的方式進行數(shù)組的處理

assume cs:codesg,ds:datasg

datasg segment

  db 'BaSiC'

  db 'MinIX'

datasg ends

codesg segment

  start:

codesg ends

end start

按照我們原來的方法,用[bx]的方式定位字符串中的字符。代碼段如下:

 mov ax,datasg

 mov ds.ax

 mov bx,0

 mov cx,5

s:mov al,[bx]

 and al,11011111B

 mov [bx],al

 inc bx

 loop s

 mov bx,5

 mov cx,5

s0:mov al,[bx]

  or al,00100000B

  mov [bx],al

  inc bx

  loop s0

現(xiàn)在我們用[bx+idata]對上面的代碼進行簡化,如下:

 mov ax,datasg

 mov ds,ax

 mov bx,0

 mov cx,5

s:mov al,[bx]

 and al,11011111B

 mov [bx],al

 mov al,[5+bx]

 or al,00100000B

 mov [5+bx],al

 inc bx

 loop s

但也可以寫成下面這種:

 mov ax,datasg

 mov ds,ax

 mov bx,0

 mov cx,5

s:mov al,0[bx]

 and al,11011111B

 mov 0[bx],al

 mov al,5[bx]

 or al,00100000B

 mov 5[bx],al

 inc bx

 loop s

如果我們用高級語言,比如C語言來描述上述程序,大致如下:

char a[5] = "BaSiC";
char b[5] = "MinIX";
main()
{
    int i;
    i = 0;
    do
    {
        a[i] = a[i] & 0xDF;
        b[i] = b[i] & 0x20;
        i++;
    }
    while(i < 5);
}

C語言:a[i],b[i]

匯編語言:0[bx],5[bx]

(六)SI和DI

si和di是8086CPU中和bx功能相近的寄存器,si和di不能夠分成兩個8位寄存器來使用

(七)[bx+si]和[bx+di]

[bx+si]和[bx+di]的含義相似,都表示一個內(nèi)存單元,它的偏移地址為(bx)+(si)

mov ax,[bx+si]

數(shù)學(xué)化的描述為:(ax)=((ds)*16+(bx)+(si))

也可以寫成如下格式:

mov ax,[bx][si]

(八)[bx+si+idata]和[bx+di+idata]

[bx+si+idata]和[bx+di+idata]含義相似,表示一個內(nèi)存單元,它的偏移地址為(bx)+(si)+idata

mov ax,[bx+si+idata]

數(shù)學(xué)化的描述為:(ax)=((ds)*16+(bx)+(si)+idata)

該指令也可寫成如下格式:

mov ax,[bx+200+si]

mov ax,[200+bx+si]

mov ax,200[bx][si]

mov ax,[bx].200[si]

mov ax,[bx][si].200

(九)不同的尋址方式的靈活應(yīng)用

  1. [idata]用一個常量來表示地址,可用于直接定位一個內(nèi)存單元。

  2. [bx]用一個變量來表示內(nèi)存地址,可用于間接定位一個內(nèi)存單元。

  3. [bx+idata]用一個變量和一個常量表示內(nèi)存地址,可在一個起始地址的基礎(chǔ)上用變量間接定位一個內(nèi)存單元。

  4. [bx+si]用兩個變量表示地址。

  5. [bx+si+idata]用兩個變量和一個常量表示地址。

總結(jié)完畢!

向AI問一下細節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI