記憶體位址定位方法

2022-03-27 15:17:35 字數 3071 閱讀 3905

1.and 和 or 指令

and    ->用來做邏輯與運算

例如:mov ax,0011b

and ax,0001b

結果:ax 中的值為0001b

or    ->邏輯或運算

指令:mov ax,0011b

or ax,1100b

結果:1111b

2.字元型資料

偽指令db(define byte)可用來定義位元組型資料;

例如:db 5

可以使用偽指令db來定義字元型資料;

格式為:db '字串'

db 'helloworld'

db 'a'

用單引號括起來'......'的方式表示資料以字元的方式給出,編譯器會將其中的字元轉換成它們對應的ascii碼;

例如:db 'u' 相當於 db 75h;

1)關於大小寫轉換

通過查ascii表可知:大寫字元+20h=小寫字元;

例如:將hello 轉換成hello

assume cs:code,ds:data

data segment

db 'hello'    ;定義字串大寫的hello

data ends

code segment

start:    mov ax,data    ;程式入口

mov ds,ax    ;將段暫存器ds指向資料段data

mov bx,0    ;偏移位址設為0

mov cx,5    ;設定迴圈次數

s:    add byte ptr [bx],20h;轉換成大寫,根據ascii碼:'a'+20h='a',byte ptr 表示傳送的時字元型資料,word ptr表示字型資料

inc bx        ;偏移位址自增1

loop s        ;從標記s處迴圈

mov ax,4c00h;程式返回

int 21h

code ends

end start

也可以利用and和or來轉換大小寫:

例如:a 和 a之間的轉換

ascii碼:

a    ->01100001

a    ->01000001

可以看出第六位的0和1決定了a的大小寫;

利用and和or可以改變某一位的值;

a轉a:

mov al,01100001b

and al,11011111b

a轉a:

mov al,01000001b

or al,00100000b

3.[bx+idata]

[bx]可以用來表示記憶體單元的偏移位址;

[bx+idata]表示偏移位址為bx中的值+idata的值;

例如:mov ax,[bx+5]

其它表示方式:

mov ax,0[bx]    ;相當於 mov ax,[0+bx]

mov ax,5[bx]    ;相當於 mov ax,[5+bx]

4.si和di

si和di暫存器和bx暫存器的用法相似,可用來表示偏移位址;

但si和di不能被拆分成兩個8位暫存器來使用;

例如:下面的三條指令功能相同

mov ax,[bx+123]

mov ax,[si+123]

mov ax,[di+123]

也可以將si和di與bx混合使用:[bx+si]、[bx+di]

mov ax,[bx+si]

mov ax,[bx+di]

si和di與bx以及idata混用:[bx+si+idata]、[bx+di+idata]

mov ax,[bx+si+6]

該指令的其它表示方式:

mov ax,[bx][si].6

mov ax,6[bx][si]

mov ax,[bx].6[si]

5.不同定址方式的靈活運用

比如:某個程式需要進行其巢狀迴圈時;

因為迴圈需要用到cx暫存器;

而內層迴圈會改變cx的值,而影響外層迴圈;

可以考慮將cx的值在進入內層迴圈前保持起來,在記憶體迴圈結束後,再重新賦給cx;

可以用另乙個暫存器,比如dx來儲存;

但是可能程式太複雜,而暫存器數量有限,比如dx被占用了;

可以用將cx的值保持在記憶體中,而不是用暫存器來儲存;

具體做法是:在資料段中用dw定義乙個字,用來儲存cx的值;

這樣做也有個問題:當需要儲存多個資料時,必須記住資料儲存到了哪個空間,容易混淆;

為了讓程式更加清晰:一般來說在需要暫存資料時,我們都應該使用棧;

例如:分別將下面四個字串的前三個字母轉為大寫

assume cs:code,ds:data,ss:stack

data segment

db 'one3456789abcde'

db 'two3456789abcde'

db 'thr3456789abcde'

db 'fou3456789abcde'

data ends

stack segment

dw '0,0,0,0,0,0,0,0'    ;定義乙個16個位元組的棧段

segment ends

code segment

start:mov ax,data

mov ds,ax

mov bx,0

mov ax,stack

mov ss,ax

mov sp,16    ;ss:sp指向棧頂

mov cx,4

s:push cx    ;將外層cx的值入棧

mov si,0

mov cx,3

s0:mov al,[bx+si]    

and al,11011111b

mov [bx+si],al

inc si

loop s0    ;內層迴圈

add bx,16

pop cx    ;從棧中彈出cx的值,恢復外層迴圈計數

loop s    ;外層迴圈

mov ax,4c00h

int 21h

code ends

end start

靈活定位記憶體位址

assume cs code,ds data,es table,ss stack data segment db 1990 1991 1992 1993 1994 1995 1996 1997 1998 1999 2000 db 2001 2002 2003 2004 2005 2006 2007 ...

彙編 7 1 靈活定位記憶體位址的方法

1.bx idata 我們用 bx 的方式來指明乙個記憶體單元,還可以用一種更靈活的方式來指明記憶體單元 bx idata 表示乙個記憶體單元,它的偏移位址為 bx idata bx中的數值加上idata 如 mov ax,bx 200 數學化的描述為 ax ds 16 bx 200 2.用 bx ...

更靈活的定位記憶體位址的方法

1 and和or指令 and指令 邏輯與指令,按位進行與運算 技巧 通過該指令可將操作物件的相應位設為0,其他位不變 or指令 邏輯或指令,按位進行或運算 技巧 通過該指令可將操作物件的相應位設為1,其他位不變 2 ascii碼 編碼方案,就是一套規則,它約定了用什麼樣的資訊來表示現實物件。例 61...