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 來提升效率