彙編語言:第五章 [BX]和loop指令

1.[bx]與內存單元安全

  [bx]是指 段地址在DS中,偏移地址在bx中的內存單元oop

2.loopdebug

  用於描述循環code

3.咱們定義的描述性符號 "()"內存

  寄存器:  (ax/al)表示ax/al寄存器中的內容編譯器

  段寄存器:   ((ds)*16+(bx))表示段地址爲ds內容,偏移地址爲bx內容的內存單元的內容asm

  內存單元:   (20000H)表示20000H內存單元中的內容編譯

4.約定符號idata表示常量效率

mov ax,idata  表示mov ax,1  mov ax,2  等軟件

mov ax,[idata]  表示mov ax,[1]   mov ax,[2]   等

段寄存機不可用這種方式mov

 

5.1[BX]

mov ax,[bx]  把ds內容做爲段地址,bx內容做爲偏移地址的2個內存單元內容放到ax中

mov [bx],ax  把ax內容放到ds內容做爲段地址,bx內容做爲偏移地址的2個內存單元中

5.2 loop指令

格式: loop 標號

loop執行步驟:1.(cx)=(cx)-1   2.判斷cx,不是0則轉到標號位置執行

例:計算2的12次方

assume cs:code

code segment

mov ax,2

mov cx,11

s:add ax,ax

loop s

code ends

end

5.3用debug跟蹤loop指令

debug 1.exe

-r

-t

-t

..

-p (int 21H用p執行)

1.若是想直接跳到CS:XX位置處執行用 -g XX

2.若是想在循環中跳出,即結束循環後停下等待-t,  使用-p命令

5.4 Debug和彙編編譯器對指令的不一樣處理

  同一指令:

  mov ax,[0] 在debug中表示把DS:0和DS:1的內存單元內容放到ax中

        在masm中等於  mob ax,0

  如何解決彙編源程序問題 :

  1. mov bx,0     mov ax,[bx]

  2. mov ax,DS:[0]

5.5 Loop和[bx]的聯合應用

 計算ffff:0-ffff:b內存單元之和存入dx中:

思考:1.結果存在dx中是否會超出範圍? 一個內存單元存0-255  12個內存單元不會超出16位

   2.內存單元值8位怎麼累加到dx 16位中? 將8位放到al中,而後ax累加到dx中

程序:

assume cs:code
code segment

mov ax,0ffffH
mov ds,ax
mov ax,0H
mov bx,0H
mov dx,0H
mov cx,0CH
s:mov al,ds:[bx]
add dx,ax
inc bx
loop s

mov ax,4c00H
int 21H
code ends
end

5.6段前綴

mov ax,[bx]  表示將DS:bx地址字單元內容存到ax中

在彙編代碼裏[bx]能夠加前綴:   ds:   cs:    ss:    es: 表示段地址在哪一個寄存器裏,這些符號就是段前綴

5.7一段安全的內存空間

1.咱們須要向內存中寫入內容

2.這段內存不能有數據,不然可能致使系統或其餘軟件出問題

3.00200H到002ffH這段空間通常不會被使用,因此向內存寫入通常就寫這裏 

 

5.8段前綴的使用

假設咱們要把ffff:0-ffff:b的內容複製到0:200-0:20b中:

1.取內容: mov al,[bx]

2.存內容: mov [bx],al

因爲ffff和0 不在同一段裏,因此取和存的時候ds須要來回切換 效率不高

咱們能夠設置ds=ffff , es=0,   mov al,ds:[bx]  mov es:[bx],al 來提升效率

相關文章
相關標籤/搜索