彙編語言07——數據處理的兩個基本問題

整理自fishcc論壇

數據處理的兩個基本問題


兩個基本問題:

處理的數據放在什麼地方
要處理的數據有多長


定義描述性符號:
reg 寄存器
sreg 段寄存器


目前已經學過的reg的集合:
ax,bx,cx,dx,sp,dp,si,di
sreg的集合:
ds,ss,cs,es


開始解決問題1:處理的數據放在什麼地方
在8086CPU中,只有四個寄存器(bx,bp,si,di)可以用在[...]中進行內存尋址
並且,這四個寄存器只能以四種組合出現:
bx & si
bx & di
bp & si
bp & di


比如,錯誤的用法:[bx + bp]


只要在[...]中使用bp,且沒有顯式指定段地址,段地址默認在ss中
比如:
mov ax,[bp + si + idata]
含義:(ax) = ((ss) * 16 + (bp) + (si) + idata)
(bp可以減輕sp的負擔...)


彙編語言中用三個概念來表示數據的位置
1,立即數(idata) mov ax,1
2,寄存器 mov ax,bx
3,段地址(sa)和偏移地址(ea) mov ax,[bx + si + 8]
mov ax,es:[bx]

下面處理第二個問題:要處理的數據有多長
方法1:通過寄存器指明:例如 mov ax,1
mov al,1
方法2:用word ptr指明要訪問內存單元是一個字單元
mov word ptr ds:[0],1
inc word ptr [bx]
用byte ptr顯性指明要訪問的內存是一個字節單元


補充:push指令只進行字操作


div指令:
div是除法指令
要求:除數爲8位或者16位
被除數(默認)放在ax或(ax和dx)中

當除數爲8位時,要求被除數爲16位(ax)
當除數爲16位時,要求被除數爲32位(dx + ax)

當結果爲8位,商存在al中,餘數在ah中
當結果爲16位,商存在ax中,餘數在dx中

div指令的格式
div reg
div 內存單元
例如: div byte ptr ds:[0]
含義:(al) = (ax) / ((ds) * 16 + 0)的商
(ah) = (ax) / ((ds) * 16 + 0)的餘數


div word ptr [bx + si + 8]
含義:(ax) = (dx * 10000H + (ax))/(ds * 16 + bx + si + 8)的商
(dx) = (dx * 10000H + (ax))/(ds * 16 + bx + si + 8)的餘數

例:
計算100001/100
100001十六進制對應186A1H
程序如下:
mov dx,1
mov ax,86A1
mov bx,100
div bx


僞指令dd
db定義字節型數據
dw定義字型數據
dd定義dword(雙字,32位)

操作符dup
與db,dw,dd配合使用,用來進行數據的重複
例如:db 3 dup (0) 定義了3個字節,都是0
等價於db 0,0,0
db 3 dup (1,2,3)
等價於1,2,3,1,2,3,1,2,3


dup使用格式:
db 重複次數 重複內容
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章