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
mov cx,8
add word ptr b[0],ax ;add word ptr b[0], ax,**含義:將ax值與b標號的低16位做加法,結果儲存在b標號的低16位中;
;此時b代表的是雙字單元,如果add b, ax;編譯器肯定報錯,因為它們的型別不匹配。
;此處必須指定b[0]是按照字單元作為儲存結構的。
;目的:防止低16位值產生進製。同理:此處必須指定b[2]是按照字單元作為儲存結構的。這個例項就是高位不溢位加法的套路。
;對於無符號數加法它的最大允許範圍是(0000 0000h~ffff ffffh):0~4294967295
add si,2 ;add si, 2;**含義:si的偏移量,由於a的偏移量是按照字單元偏移,故si為2個位元組的偏移
loop s
mov ax,4c00h
int 21h
code 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
int 21h
code 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 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開始的偏...
組合語言 直接定址表
功能 將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 如果想在 段中,直接用資料標...