之前本來打算學作業系統的但發現需要彙編與計組的基礎。因此這個星期看了一些彙編,做一些筆記。
對於初學者來說,初學彙編真的是會很迷惑,因為你會了解到彙編不止一種,一種處理器架構就會有一種彙編,面對各種各樣的彙編我真是不知道學哪種了,最後問了學過的人,其實沒什麼關係,選一種認真學就好了,我選的是8086的彙編。
一.關於暫存器
8086有四種暫存器:1.資料暫存器:ax,bx,cx,dx
其中資料暫存器又可以分為兩個8位暫存器。分別為ah,al,bh,bl,...其中ah,al分別是
ax的高八位和低八位。
二,關於數的表示。
用0和1數碼的組合在計算機中表達的數值稱為機器數;對應地,現實中真實的數值被稱為真值。無符號數表示起來很簡單,直接按二進位制的加權轉換就行。比如8位二進位制可以表示0-255的無符號數,直接就是00000000,00000001 ,...,11111111。
有符號數的表示多種,如原碼,反碼和補碼。計算機中預設用補碼表示。
原碼:最高有效位表示符號(正數0,負數1),其他位置直接表示數值大小
反碼:正數的反碼和原碼相同,最高位為0,其餘位為數值位。負數的反碼則不同
最高位仍是1,但數值位按位取反。對於數值0,在原碼和反碼中有+0和-0兩種表示法。
所以,8位二進位制原碼和反碼能表示的數值範圍是-127--+127。
補碼:正數的補碼和原碼相同,負數的補碼則為反碼在最低位加1.在補碼中0只有一種補碼表示00000000。而10000000表示-128。
採用補碼,減法運算可以變成加法運算。這樣硬體電路只需設計加法器。
三,十六進製制的乘法
十六進製制的乘法和十進位制的一樣但是規則是逢16進1:
以計算350ah*12h為例:
先用2*350a
2*a=20 進一位餘20-16 = 4
2*0 = 0 進零位餘零位加上面的進製等於1
2*5 = 10 進零位餘a
2*3 = 6 進零位餘6
所以2*350a = 6a14
同理 10h*350a = 350a0
最後350a*12h = 6a14 + 350a0 = 3bab4 ;
這裡有必要說一下 十六進製制裡面 乘以16 相當於向左移一位,在右邊加個0,和十進位制裡乘以10類似。
四,資料的儲存方式:
1.8086的儲存方式是小端方式,就是當用多個位元組來儲存資料時低位元組儲存在低位址,高位元組儲存在高位址,並且用低位址表示這個資料位址。所以我們知道同乙個位址可以看成是位元組單元的位址,也可以看成是字單元的位址還可以看成是雙字單元的位址。
常要進行位址邊界對齊。
每個儲存單元都有唯一乙個20位的位址,被稱為該單元的實體地址或絕對位址。
將邏輯位址中的段位址左移4位,加上偏移位址就得到20位的實體地址。多個邏輯位址可以對映到同乙個實體地址。
彙編 求兩個數之和
data segment 定義位元組型別資料add1,add2,sum和cont 存放兩個加數的長度 add1 db 11h,11h,11h,11h,11h,11h add2 db 66h,55h,44h,33h,22h,11h sum db 6 dup 0 cont db 3 data ends ...
不用if比較兩個數大小
一 問題 有兩個變數a,b,不用 if switch或者其它判斷語句,找出兩個數中間比較大的 二 解決方案 方法1 取平均值法 大的為 a b abs a b 2 小的為 a b abs a b 2 int fmax1 int a,int b 方法2 不使用abs ab時,b a 0,所以前面為a ...
比較兩個數的大小
一 問題 有兩個變數a,b 找出兩個數中間比較大的 二 解決方案 方法1 取平均值法 大的為 a b abs a b 2 小的為 a b abs a b 2 int fmax1 int a,int b 方法2 不使用abs ab時,b a 0,所以前面為a a b 後面為a b,那麼結果就是a in...