回覆列表
  • 1 # 高大美女的

    STACK SEGMENT STACK;定義堆疊段開始

    DB 0B0H,0B1H,0B2H,0B3H,0B4H,0B5H,0B6H,0B7H,;用偽指令db定義一個位元組的變數,每個運算元佔一個位元組,資料依次會寫入記憶體

    DB 0B8H,0B9H;以字母開頭的十六進位制要在前面多加個0,以便於與標示符的區別

    DB 0BAH,0BBH,0BCH,0BDH,0BEH,0BFH

    DB 10H DUP(00);位元組以00h重複16次

    STACK ENDS;堆疊段結束

    DATA1 SEGMENT;資料段1的開始

    DB 0A0H,0A1H,0A2H,0A3H

    TABLE DW 0A5A4H;定義字變數TABLE

    DB 0A6H,0A7H,0A8H,0A9H,0AAH,0ABH

    DB 0ACH,0ADH,0AEH,0AFH

    DATA1 ENDS;資料段1的結束

    DATA2 SEGMENT;資料段2的開始

    DB 0C0H,0C1H,0C2H,0C3H,0C4H,0C5H,0C6H,0C7H

    DB 0C8H,0C9H,0CAH,0CBH,0CCH,0CDH,0CEH,0CFH

    DATA2 ENDS;資料段2的結束

    CODE SEGMENT;程式碼段的開始

    ASSUME CS:CODE, DS:DATA1, ES:DATA2, SS:STACK;段分配偽指令ASSUME

    ;說明當前那些邏輯段被分別定義為程式碼段,堆疊段,資料段,附加段

    START:MOV AX,DATA1

    MOV DS,AX;透過中間暫存器AX把段地址賦值給DS

    MOV AX,DATA2

    MOV ES,AX;透過中間暫存器AX把段地址賦值給SS,使ES指向DATA2段地址

    MOV BX,0004H

    MOV CX,0005H

    MOV BP,0003H

    MOV SI,0002H

    MOV DI,0001H;以上5個是將立即數賦值給暫存器,屬於立即數定址

    MOV AX,CX;使AX=CX,暫存器定址

    MOV AX,500H

    MOV AX,TABLE;把TABLE變數取一個字的內容給AX,需訪問儲存器,屬於儲存器定址

    ;預設段為DS

    MOV AX,ES:[BX];ES段BX偏移的記憶體單元內容給ES,屬於儲存器定址中的暫存器間接定址

    MOV AX,[BX+05H];段地址為DS,偏移地址為BX+05H,BX,si,di預設使用DS段

    MOV AX,SS:[BX]+03H;段地址為SS,偏移地址為BX+03H

    MOV AX,TABLE[BX];段地址為DS,偏移地址為BX+TABLE

    MOV AX,07H[BX];段地址為DS,偏移地址為BX+07H

    MOV AX,[BP];段地址為SS,偏移地址為BP,BP預設使用堆疊段

    MOV AX,TABLE[BP];段地址為SS,偏移地址為BX+TABLE

    MOV AX,08H[BP]

    MOV AX,[BP+06H]

    MOV AX,DS:[BP+03H];使用了段字首DS,段地址為DS,偏移地址為BP+03H

    MOV AX,[BP]+05H

    MOV AX,ES:[SI+03H];使用了段字首ES,段地址為ES,偏移地址為SI+03H

    MOV AX,[DI+06H]

    MOV AX,[DI]+05H

    MOV AX,TABLE[SI]

    MOV AX,[SI]

    MOV AX,TABLE[DI]

    MOV AX,[SI]+05H;段地址為DS,偏移地址為SI+05H;以上都是暫存器間接定址

    MOV AX,[BX][DI+01H];段地址為DS,偏移地址為BX+DI+01H,屬於基址變址定址

    MOV AX,[BX][SI]+03H

    MOV AX,TABLE[BX][SI];段地址為DS,偏移地址為BX+SI+TABLE,屬於基址變址定址

    MOV AX,ES:[BX][DI];段地址為ES,偏移地址為BX+DI,屬於基址變址定址

    MOV AX,[BP][DI+02H]

    MOV AX,TABLE[BP][DI];bp預設堆疊段,段地址為SS,偏移地址為BX+DI+TABLE,屬於基址變址定址

    MOV AX,ES:[BP][SI]

    MOV AX,[BP][SI+05H]

    MOV AX,03H[BP][DI]

    MOV AX,[BP][SI]

    MOV AX,[BP+02H][DI+03H]

    MOV AH,4CH;返回DOS,中斷呼叫

    INT 21H

    CODE ENDS;程式碼段結束

    END START

    定址方式

    1.立即定址:

    MOV AH, 80H

    MOV ECX,123456H

    2.暫存器定址

    MOV EAX, EBX

    MOV VARD, EAX

    3.直接定址

    MOV BX, [1234H] ,執行時,(DS)=2000H,記憶體單元21234H的值為5213H。問該指令執行後,BX的值是什麼

    -->由於1234H是一個直接地址,它緊跟在指令的操作碼之後,隨取指令而被讀出;

    -->訪問資料段的段暫存器是DS,所以,用DS的值和偏移量1234H相加,得儲存單元的物理地址:21234H;

    -->取單元21234H的值5213H,並按“高高低低”的原則存入暫存器BX中。

    由於資料段的段暫存器預設為DS,如果要指定訪問其它段內的資料,可在指令中用段字首的方式顯式地書寫出來。

    MOV ES:[1000H], AX

    4.暫存器間接定址

    MOV BX,[DI]

    -->若有效地址用SI、DI和BX等之一來指定,則其預設的段暫存器為DS;

    -->有效地址用BP來指定,則其預設的段暫存器為SS(即:堆疊段)。

    5. 基址加變址定址

    MOV BX, [BX+SI]

    -->運算元在儲存器中,其有效地址是一個基址暫存器(BX、BP)和一個變址暫存器(SI、DI)的內容之和

    6.相對基址加變址定址

    MOV AX, [BX+SI+200H]

    MOV AX, 1000H[BX+SI]

    -->運算元在儲存器中,其有效地址是一個基址暫存器(BX、BP)的值、一個變址暫存器(SI、DI)的值和指令中的8位/16位偏移量之和

    7. 32位地址的定址方式

    -->但在用32位暫存器定址時,不存在上述限制,所有32位暫存器(EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP)都可以是地址偏移量的一個組成部分。

    32位基址暫存器是:EAX、EBX、ECX、EDX、ESI、EDI、EBP和ESP;

    32位變址暫存器是:EAX、EBX、ECX、EDX、ESI、EDI和EBP(除ESP之外)。

    1、地址中暫存器的書寫順序決定該暫存器是基址暫存器,還是變址寄存

    [EBX+EBP]中的EBX是基址暫存器,EBP是變址暫存器,而[EBP+EBX]中的EBP是基址暫存器,EBX是變址暫存器;

    2、預設段暫存器的選用取決於基址暫存器;

    3、基址暫存器是EBP或ESP時,預設的段暫存器是SS,否則,預設的段暫存器是DS

  • 中秋節和大豐收的關聯?
  • 你們都是怎麼哄女孩開心的?