每天寫點程式,生活多美好 1

2021-05-27 17:42:37 字數 4248 閱讀 4645

m彙編學習過程中用到的例項:

mov ax, 5807h

mov cx,9

mov al, [0010h]

雖然預設是ds段,但是沒加ds的時候還是沒有真正從儲存器定址,只好把ds加上了(根據後面的實驗,如果不加段暫存器,會被當做立即數看待,和書上講的還是有點差距奧)。

mov ax, [0010h]

這裡將把[0010h]計算出來的實體地址pa對應的數值賦給al,然後位址加一位置的數值賦給ax。

mov ax, ds: [0010h]

mov bx, 0009h

mov al, ds:[bx]

暫存器間接定址

mov bx, 0009h

mov ax, 0010h[bx+si]

基址變址定址

比如我的cpu時鐘頻率是2.8ghz=> 單時鐘週期為:0.357ns

【1s=1000ms=10(6)微s=10(9)ns】

【1ghz=10(9)hz】

還需要理解指令在不同定址方式下的基本執行時間,以及對應的計算ea所需的週期數。

六類指令:1 傳送指令

資料傳送指令:

[立即數和段暫存器cs不能作為目的運算元;源運算元和目的運算元不能同為儲存器操作器]

mov ax,bx;

mov cl, 80h

mov al, [2000h]

mov ds:[0005h], ax

我用的這個版本必須加ds,書上沒有見。

這句話的意思是將ax當前的值移動到ds基位址偏移5h的位置,我們在debug中使用d命令檢視時,直接 -d 0005就可以看到這個值是否和ax中一致【需要注意的是,d命令中輸入的預設位址本來就是相對於段暫存器的偏移位址】

另外這裡還可以是cs,es,但是masm5中居然還不支援fs.

mov bx, 0001h

mov si, 0002h

mov word ptr[bx+si], 88h

這條命令就把ds:0003的位置的值賦為88h。由於這裡用了word ptr,因此運算元的型別為字,因此是把0080h的值傳送到偏移位址0003h處(0003被賦值為80h,同時0004被賦值為00h),如果是mov byte ptr[bx+si], 88h,就不會把0004賦值為00.

mov ax,0a0bh

mov bx,0c0dh

mov cx,0e0eh

push ax

push bx

push cx

pop ax

pop cx

pop bx     

執行完前4句後,把ax放入堆疊中,就可以通過-d ss:[sp的值] 如sp=00fe,這裡就是 -d ss:00fe實際中不要加中括號,來檢視棧頂的內容了,如果正常的話,就應該時0b 0a。

執行完pop ax後,ax就被賦值為cx的值了。同理cx=原bx的值;bx等於原ax的值。

實驗結果表示同意。

xchg ax, bx

會交換兩個通用暫存器的值。

1.2 累加器專用傳送指令

xlat

把bx與al相加形成有效位址,將該單元中的單位元組數傳送到al中

mov bx,4c02h

mov al, 1dh

xlat

執行xlat時,根據xlat的定義,就會把bx+al=4c0f位置的值(單位元組)送到al,通過-d 4c0f發現此處是16,正是執行後al的值。

in 累加器 埠位址

從指定位址輸入乙個位元組到al或輸入乙個字到ax, 埠位址以數值形式給出或者通過dx間接給出(埠位址大於255時,只能由dx給出)

mov dx, 280h

in al, dx

執行時,debug直接退出了

out 埠位址 累加器

實現輸出,與in輸入反方向資料傳送

1.3 位址傳送指令

lea 目的運算元 源運算元

將源運算元的有效位址ea傳送給通用暫存器

mov bx, 0408h

mov si, 2000h

lea bp, [bx+si+6]

將240eh送bp,而不是將此單元中的內容送bp。

lds 目的運算元,源運算元

lds si, es:[40h]

將源運算元指定的儲存單元中的雙字(通常為段位址和有效位址)傳送給ds及目的運算元,高兩位元組送ds,低兩位元組送目的運算元。

les 目的運算元,源運算元

傳送時將高兩位元組送es,而不是送ds

1.4 標誌傳送指令專用於對標誌暫存器進行操作。8086、8088標誌暫存器具有16位,lahf和sahf僅對低8位操作,而pushf和popf對整個標誌暫存器操作。只有sahf和popf影響標誌暫存器的內容。

lahf

將標誌暫存器低8位送ah

sahf

將ah送標誌暫存器低8位

pushf

將標誌暫存器內容壓入堆疊

2 算術運算指令:二進位制算術指令運算指令和bcd數算術運算調整指令

mov al, 00eeh

mov bl, 009eh

add al, bl

對應的加法sub:

sub al, bl

很奇怪的乙個現象,當我把eeh賦值給al時,居然不能識別,只好在前面加了兩個00.

mov dx, 2000h

mov ax, 8a04h

add ax, 9d00h

adc ax, 45h    

對應的減法sbb:    

主要用於多位元組加法運算,dx儲存了被加數的高兩個位元組,

ax儲存了低兩位元組;相加後ax=2704h,cf=1(相加結果

超過了兩個位元組)。adc實現高兩位元組的相加,且將cf價

值dx,使dx為2046h。

sbb時同樣減去執行前得cf值。

mov si, 2000h

mov al, [si]

incsi

add al, [si] 

對應的減1dec實現了把2000h單元和2001單元的內容的相加,可以通過 -d 2000 檢視。

但是inc(dec)不影響cf標誌。

neg ax

求補碼(用0減去自身)

cmp ax, bx

如果一樣,零標誌為1 (zr)

備註:

標誌暫存器

溢位標誌of(over flow flag)                             ov(1)                         nv(0)

方向標誌df(direction flag)                             dn(1)                          up(0)

中斷標誌if(interrupt flag)                                ei(1)                           di(0)

符號標誌sf(sign flag)                                     ng(1)                          pl(0)

零標誌zf(zero flag)                                        zr(1)                         nz(0)

輔助標誌af(auxiliary carry flag)                      ac(1)                          na(0)

奇偶標誌pf(parity flag)                                  pe(1)                          po(0)

進製標誌cf(carry flag)                                  cy(1)                         nc(0) 

電影感悟 生活多美好

這部1946年的電影,1946年呀,那個時候新中國還沒有成立呢。老實說我被裡面講的東西感動了,這電影隱隱約約之前也看過,只是那時沒有那麼大的感悟而已。三十而立,年輕人。如果你沒有出來,如果你只是在自己的村子,鎮上現在是什麼樣子?不敢想象,畢竟我不是他,行業也不是他那種高大上的金融行業。但有些是相同的...

國外程式設計師每天四小時的程式設計生活

每個人都熟悉這種作息規律 早上9點去上班,坐在電腦前面,編一天的程式,下午5點下班回家。如今,非常感謝蒂莫西 費里斯 timothy ferriss 的 每週工作4小時 我開始重新思考應該如何工作,如何讓自己變成更有效率的程式設計師。最近,我把我的從周一到周五的作息規律做了一次較大的調整。很長時間以...

每天學習乙個C 程式 n 1

泳池的長為50公尺,寬為25公尺,水深為1.8公尺。程式設計計算泳池的周長 半周長 面積和儲水量。無150 751250 2250 include using namespace std intmain 2 在 7行和8行,我們向計算機 申請 了三個變數,可以理解為三個記憶體空間,為了方便使用和描述...