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 如果想在 段中,直接用資料標...