組合語言 直接定址表

2021-10-03 23:56:52 字數 2603 閱讀 6737

assume cs:code

code segment

a dw 1,2

,3,4

,5,6

,7,8

;a代表了code段的首位址code:00,由於dw,也代表了a開始的這一小段記憶體都是按照字單元儲存的。

;從code:[0]

~code:[15

],也就是,a[0]

~a[15

];a[si]代表了從code:00開始的偏移量為si的記憶體單元。

;此記憶體單元是字單元,故si的偏移量是2個位元組。

b dd 0

;b代表了code段中緊鄰a段位址的code:[

16](首位址),乙個雙字的單元,它儲存位置是code:[16

]~code:[19

],也就是b[0]

~b[3];

;剩下的空間都是真正的cpu執行的**了。

start:mov si,

0 mov cx,

8 s:mov ax,a[si]

;mov ax, a[si]**含義:將偏移量為si的段位址(或記憶體段首位址)為a的記憶體單元按字單元送入到ax中。

add word ptr b[0]

,ax ;add word ptr b[0]

, ax,**含義:將ax值與b標號的低16位做加法,結果儲存在b標號的低16位中;

;此時b代表的是雙字單元,如果add b, ax;編譯器肯定報錯,因為它們的型別不匹配。

;此處必須指定b[

0]是按照字單元作為儲存結構的。

adc word ptr b[2]

,0;adc word ptr b[2]

,0;**含義:帶進製加法,將0與上一指令中的cf值相加,結果儲存在b的高16位單元中。

;目的:防止低16位值產生進製。同理:此處必須指定b[

2]是按照字單元作為儲存結構的。這個例項就是高位不溢位加法的套路。

;對於無符號數加法它的最大允許範圍是(0000

0000h~ffff ffffh):0

~4294967295

add si,

2;add si,

2;**含義:si的偏移量,由於a的偏移量是按照字單元偏移,故si為2個位元組的偏移

loop s

mov ax,

4c00h

int21hcode ends

end start

assume cs:code, ds:data

data segment ;即使在assume這個偽指令中將ds和data聯絡在一起(c語言的全域性宣告意思)。

;如果沒有將data的段位址賦值給ds,那麼[si]定址的記憶體單元是錯誤的,並不是ds:

[si]或a[si]。

a db 1,2

,3,4

,5,6

,7,8

b dw 0

data ends

code segment

start: mov ax,data ;如果在assume中沒有ds:data,那麼在code段中使用a和b是不可能的。因為a和b在code段是不可以見的。

mov ds,ax

mov si,

0 mov cx,

8 s: mov al, a[si]

;a[si]代表的是乙個位元組(它已經代表位址和單元長度了),賦值給ax是錯誤的,應該賦值給al,別犯這樣的低階錯誤。

;(ah)=

0,是防止高位不為零,al+ah組合成資料就是(ax)。

mov ah,

0

add b, ax

inc si

loop s

mov ax,

4c00h

int21hcode ends

end start

1. 自定義(對映)表

自定義(對映)表是一種巧妙的程式設計方法。在程式設計時,我們可以利用各種自定義(對映)表,在兩個資料集合之間建立一種對映關係,使得我們可以利用查表的方法,根據給出的資料(輸入)得到其在另乙個集合中的對應資料(輸出)。這種設計一般來說有以下3中目的:

2. 資料表

table db '0123456789abcdef'
在這張字元表(字串)中,它的下標(index)和對應的字元(value),兩者之間有乙個簡單的線性對映關係。我們通過下標運算(查表),就可以快速地從給定的數獲取對應的字元。

3. 位址表

table    dw ag0,ag30,ag60,ag90,ag120,ag150,ag180        ;字串偏移位址表

ag0 db '0',0

;利用mov bx,table[bx]做為table的偏移,取得對應的字串的偏移位址,放入bx中

ag30 db '0.5',0

ag60 db '0.866',0

ag90 db '1',0

ag120 db '0.866',0

ag150 db '0.5',0

ag180 db '0'

,0

組合語言 直接定址表

assume cs code code segment 從code 0 code 15 也就是,a 0 a 15 a si 代表了從code 00開始的偏移量為si的記憶體單元。此記憶體單元是字單元,故si的偏移量是2個位元組。剩下的空間都是真正的cpu執行的 了。start mov si,0 mo...

組合語言 直接定址表

功能 將a位址中的1 8的數值相加,並儲存到b位址中。assume cs code code segment a db 1,2,3,4,5,6,7,8 b dw 0 start mov si,offset a mov di,offset b mov ah,0 mov cx,8 s mov al,cs...

組合語言學習筆記(十六)直接定址表

code segment a db 1,2,3,4 b dw 0 標號a,描述了位址code 0,和從這個位址開始,以後的記憶體單元都是位元組單元 標號b,描述了位址code 8,和從這個位址開始,以後的記憶體單元都是字單元 mov ax,b相當於mov ax,cs 8 如果想在 段中,直接用資料標...