日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > windows >内容正文

windows

深入理解操作系统——datalab-handout

發(fā)布時間:2023/12/20 windows 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深入理解操作系统——datalab-handout 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

實驗?zāi)康?#xff1a;

1.替換bits.c中各個函數(shù)中的return,格式要求如下所示:
int Funct(arg1, arg2, …) {
/* brief description of how your implementation works */
int var1 = Expr1;

int varM = ExprM;

varJ = ExprJ;...varN = ExprN;return ExprR;

}
其中,每一個“Expr”只能使用如下規(guī)則:
① 數(shù)字只能使用0到255(0xff),不能使用像0xffffffff這樣大的數(shù)字
② 函數(shù)參數(shù)和局部變量(沒有全局變量)
③ 一元運算目:! ~
④ 二元運算目:& ^ | + << >>
2.bits.c中所給的15個函數(shù)都是缺失的,需要用上每個函數(shù)被允許的操作去實現(xiàn)所要求的功能。
3.下面的操作不被允許:
① 使用任何控制結(jié)構(gòu),如if, do, while, for, switch等。
② 定義或使用任何宏。
③ 在此文件中定義任何其他函數(shù)。
④ 調(diào)用任何庫函數(shù)。
⑤ 使用任何其他的操作,如&&, ||, -, or ?:
⑥ 使用任何形式的casting
⑦ 使用除int以外的任何數(shù)據(jù)類型。這意味著你不能使用數(shù)組、結(jié)構(gòu)等。
對于需要你執(zhí)行浮點運算的問題,編碼規(guī)則較不嚴(yán)格。允許使用循環(huán)和條件控制也可以同時使用int和unsigned。可以使用任意整數(shù)和無符號常量。

實驗內(nèi)容及操作步驟:

一、初步安裝dlc:
由于第二次試驗是基于dlc編譯環(huán)境,所以需要先進(jìn)行添加,即將本次實驗的文件夾datalab-handout復(fù)制到linux環(huán)境下,之后的實驗都是在這個文件夾下進(jìn)行:


二、填寫bits.c中實驗需填寫的內(nèi)容,并進(jìn)行簡單的解釋:
先對整個bits.c文件進(jìn)行翻譯,了解到要求是:
警告:請不要使用<stdio.h>頭文件,他會使dlc編譯器發(fā)生錯誤,你可以仍舊在不包含<stdio.h>頭文件的情況下使用printf語句來調(diào)試,盡管你可能會有警告信息。一般情況,忽視警告信息是不對的,但在這里沒有問題
你將會通過編譯和調(diào)用在這個源文件中的函數(shù)來設(shè)計自己的代碼,并最終向數(shù)據(jù)實驗室提供你的解決方案。通過一行或多行的c語言代碼來替代函數(shù)中的return語句并實現(xiàn)函數(shù),你的代碼必須滿足下面幾個規(guī)則:

  • 0到255(包含)之間的整數(shù)常量,你不能使用太大的常數(shù)
  • 功能語句和局部變量(不能使全局變量)
  • 一元整數(shù)操作如!(邏輯非)和~(按位非)
  • 二元整數(shù)操作如&(按位與)、^(異或)、|(或)、+(相加)、<<(算術(shù)左移)、>>(算術(shù)右移)
    你不被允許以下操作:
  • 使用任何一個控制結(jié)構(gòu),像if,do,while,for,switch等等
  • 定義或使用宏
  • 在本文件中定義任何一個格外的函數(shù)
  • 聲明或調(diào)用任何函數(shù)
  • 使用別的任何操作符,如&&、||、-或者?
  • 使用任何形式的指針
  • 使用任何除了int之外的數(shù)據(jù)類型,這里暗示你不能使用數(shù)組,結(jié)構(gòu)體和類
    你可以假定你的機器:
  • 使用2的補碼表示負(fù)數(shù),32位表示整數(shù)
  • 執(zhí)行算術(shù)右移
  • 移動一個整數(shù)超過他的字長的時候會產(chǎn)生不可預(yù)測的后果
    對于要執(zhí)行浮點操作的問題,編碼規(guī)則不那么嚴(yán)格,允許使用循環(huán)和條件控制即if和for語句,你可以使用int和unsigned,可以使用任意整數(shù)和無符號常量
    你被禁止:
  • 定義或使用宏
  • 在本文件中定義任何其他函數(shù)
  • 聲明或調(diào)用任何函數(shù)
  • 使用任何形式的指針
    5.使用除int和無符號以外的任何數(shù)據(jù)類型,意味著不能用數(shù)組,結(jié)構(gòu)體或類
  • 使用任何浮點數(shù)據(jù)類型,操作或常量
    提示:
  • 使用dlc(數(shù)據(jù)實驗室檢查器)編譯器(在講義中描述)來檢查解決方案的合法性
  • 每一個函數(shù)都有一個最大數(shù)量的操作符,允許你在實現(xiàn)該函數(shù)時使用這些操作符。最大操作符計數(shù)由dlc檢查,請注意“=”不計算在內(nèi),你可以隨意使用運算符
  • 使用btest測試工具來檢查你的功能是否正確
  • 使用bdd檢查器正式的驗證你的功能
  • 每個函數(shù)的最大操作數(shù)在每個函數(shù)的頭注釋中給出,如果在編寫和次文件中最大操作數(shù)之間存在不一致,請將此文件作為權(quán)威來源
    三、對函數(shù)進(jìn)行添加和重寫:
    1、
  • /* * bitAnd - x&y using only ~ and | * Example: bitAnd(6, 5) = 4* Legal ops: ~ |* Max ops: 8* Rating: 1*/ int bitAnd(int x, int y) {return ~((~x)|(~y)); }

    代碼解釋:使用~與|實現(xiàn)按位與,真值表為(每一位):

    由于最高限制次數(shù)為8次,那么只能使用德摩根律,得到x&y=(X|~Y)即可。
    2、

    /* * getByte - Extract byte n from word x* Bytes numbered from 0 (LSB) to 3 (MSB)* Examples: getByte(0x12345678,1) = 0x56* Legal ops: ! ~ & ^ | + << >>* Max ops: 6* Rating: 2*/ int getByte(int x, int n) {return ((x>>(n<<3))&0xff); }

    代碼解釋:將一個32位數(shù)實現(xiàn)返回對應(yīng)編號位置的數(shù)字,先將編號n轉(zhuǎn)換為移動的位數(shù),比如2就要移動2x2^3個位置,0則不需要移動,將所需要的數(shù)字移動到最低位,接著按位與0XFF,只取最低的兩位,得到最終結(jié)果。按位與0xFF表示保留最后一個字節(jié)。
    例:假設(shè)x=0x12345678,n=2
    那么78是編號0,56編號為1,n移動3位后得到的結(jié)果是2x8=16位,即需要把x向右移動16位,算數(shù)邏輯均可。以算數(shù)為例,則x為0x00001234,取最后的兩位即34,即為所求結(jié)果。
    3、

    /* * logicalShift - shift x to the right by n, using a logical shift* Can assume that 0 <= n <= 31* Examples: logicalShift(0x87654321,4) = 0x08765432* Legal ops: ! ~ & ^ | + << >>* Max ops: 20* Rating: 3 */ int logicalShift(int x, int n) {return ~((((1<<31)&x)>>n)<<1)&(x>>n); }

    代碼解釋:將32位數(shù)邏輯右移n位
    邏輯右移是在左端補最高有效位的值,算術(shù)右移是直接補0,所以將1左移31位后得到最高位為1,其他全為0的數(shù),與x相與后得到x的符號位,其他全為0的數(shù),其再算術(shù)右移n位然后左移一位,有n個符號位剩余全為0的數(shù),再取反得到n個符號位的相反位,其他全為1的數(shù)。這個數(shù)再與x算術(shù)右移n為的數(shù)進(jìn)行相與,首先右端的數(shù)和1111相與后結(jié)果不變,而符號位會進(jìn)行保留。
    4、

    /** bitCount - returns count of number of 1's in word* Examples: bitCount(5) = 2, bitCount(7) = 3* Legal ops: ! ~ & ^ | + << >>* Max ops: 40* Rating: 4*/ int bitCount(int x) {int count; int tmpMask1 = (0x55)|(0x55<<8); int mask1 = (tmpMask1)|(tmpMask1<<16); int tmpMask2 = (0x33)|(0x33<<8); int mask2 = (tmpMask2)|(tmpMask2<<16); int tmpMask3 = (0x0f)|(0x0f<<8); int mask3 = (tmpMask3)|(tmpMask3<<16); int mask4 = (0xff)|(0xff<<16); int mask5 = (0xff)|(0xff<<8); count = (x&mask1)+((x>>1)&mask1); count = (count&mask2)+((count>>2)&mask2); count = (count + (count >> 4)) & mask3; count = (count + (count >> 8)) & mask4; count = (count + (count >> 16)) & mask5; return count; }

    代碼解釋:輸入一個int型數(shù)字,輸出該數(shù)字中機器碼中有多少個1,即通過二分法進(jìn)行查找記錄即可,先計算每兩位中1的個數(shù),并用對應(yīng)的兩隊來進(jìn)行存儲,然后計算每四位中1的個數(shù),用對應(yīng)的4位進(jìn)行存儲,最后得到16位中1的個數(shù),即x中1的個數(shù)
    5、

    在這里插入代碼片

    代碼解釋:不用!而實現(xiàn)!功能。第一步~x+1求補碼,與x本身進(jìn)行相或后得到最高有效位,如果大于0那么最高有效位必為1,將該數(shù)邏輯右移31位后得到要么全零要么全一的數(shù),然后與1相與得到一個相反的值就可以實現(xiàn)!的操作。
    6、

    /** tmin - return minimum two's complement integer * Legal ops: ! ~ & ^ | + << >>* Max ops: 4* Rating: 1*/ int tmin(void) {return 1<<31; }

    代碼解釋:得到最小的二進(jìn)制數(shù),直接左移1即可
    7、

    /** fitsBits - return 1 if x can be represented as an * n-bit, two's complement integer.* 1 <= n <= 32* Examples: fitsBits(5,3) = 0, fitsBits(-4,3) = 1* Legal ops: ! ~ & ^ | + << >>* Max ops: 15* Rating: 2*/ int fitsBits(int x, int n) {//get 32-n;return !(((x >> (n+(~0))) + 1)>>1); }

    代碼解釋:判斷x是否能被n位二進(jìn)制數(shù)表示,即x是否在-2(n-1)到2(n-1)-1范圍內(nèi)
    8、

    /** divpwr2 - Compute x/(2^n), for 0 <= n <= 30* Round toward zero* Examples: divpwr2(15,1) = 7, divpwr2(-33,4) = -2* Legal ops: ! ~ & ^ | + << >>* Max ops: 15* Rating: 2*/ int divpwr2(int x, int n) {return (x+((x>>31)&((1<<n)+(~0))))>>n; }

    代碼解釋:x除以2的n次方,實際上直接右移n位即可,面對負(fù)數(shù)時需要加上一個偏移量
    9、

    /** negate - return -x * Example: negate(1) = -1.* Legal ops: ! ~ & ^ | + << >>* Max ops: 5* Rating: 2*/ int negate(int x) {return ~x+1; }

    代碼解釋:取x的相反數(shù),直接返回~x+1即可
    10、

    /** isPositive - return 1 if x > 0, return 0 otherwise * Example: isPositive(-1) = 0.* Legal ops: ! ~ & ^ | + << >>* Max ops: 8* Rating: 3*/ int isPositive(int x) {return !(x>>31|(!x)); }

    代碼解釋:如果x大于0則返回1,否則返回0,直接判斷符號位,但需要特殊考慮0
    11、

    /** isLessOrEqual - if x <= y then return 1, else return 0 * Example: isLessOrEqual(4,5) = 1.* Legal ops: ! ~ & ^ | + << >>* Max ops: 24* Rating: 3*/ int isLessOrEqual(int x, int y) {int signx=x>>31; int signy=y>>31;int signSame=((x+((~y)))>>31)&(!(signx^signy));int signDiffer=signx&(!signy);return signDiffer|signSame; }

    代碼解釋:如果x小于等于y,則返回1,否則返回0。先對符號位進(jìn)行比較,第1,2行得到了x和y的符號位,第3行比較兩者相減是否越界,第四行得到兩者的符號位是否異號,最終返回兩個結(jié)果的相或結(jié)果,只要有一者為1,那么就代表x小于等于y,否則x大于y
    12、

    /** ilog2 - return floor(log base 2 of x), where x > 0* Example: ilog2(16) = 4* Legal ops: ! ~ & ^ | + << >>* Max ops: 90* Rating: 4*/ int ilog2(int x) {int bitsNumber=0;bitsNumber=(!!(x>>16))<<4;//bitsNumber=bitsNumber+((!!(x>>(bitsNumber+8)))<<3);bitsNumber=bitsNumber+((!!(x>>(bitsNumber+4)))<<2);bitsNumber=bitsNumber+((!!(x>>(bitsNumber+2)))<<1);bitsNumber=bitsNumber+(!!(x>>(bitsNumber+1)));//for non zero bitsNumber, it should add 0//for zero bitsNumber, it should subtract 1bitsNumber=bitsNumber+(!!bitsNumber)+(~0)+(!(1^x));//當(dāng)x為0時,還需要減一才能得到正確值。return bitsNumber; }

    代碼解釋:得到一個數(shù)是由多少二進(jìn)制位表示,倒數(shù)第二行表示當(dāng)x為0的時候,還需要進(jìn)行減一才能得到正確值,是一個類似于分治法,逐步化簡。
    13、

    /** float_neg - Return bit-level equivalent of expression -f for* floating point argument f.* Both the argument and result are passed as unsigned int's, but* they are to be interpreted as the bit-level representations of* single-precision floating point values.* When argument is NaN, return argument.* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 10* Rating: 2*/ unsigned float_neg(unsigned uf) {unsigned result;unsigned tmp;result=uf^0x80000000; //將符號位改反 -f tmp=uf & (0x7fffffff);if(tmp > 0x7f800000)//此時是NaNresult = uf;return result; }

    代碼解釋:計算浮點數(shù)的相反數(shù),直接將符號位改反即可,但需要判斷NAN的情況,這里已經(jīng)是浮點數(shù)類型了,可以使用if判斷。
    14、

    /** float_i2f - Return bit-level equivalent of expression (float) x* Result is returned as unsigned int, but* it is to be interpreted as the bit-level representation of a* single-precision floating point values.* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 30* Rating: 4*/ unsigned float_i2f(int x) {unsigned shiftLeft=0;unsigned afterShift, tmp, flag;unsigned absX=x;unsigned sign=0;//special caseif (x==0) return 0;//if x < 0, sign = 1000...,abs_x = -xif (x<0){sign=0x80000000;absX=-x;}afterShift=absX;//count shift_left and after_shiftwhile (1){tmp=afterShift;afterShift<<=1;shiftLeft++;if (tmp & 0x80000000) break;// }if ((afterShift & 0x01ff)>0x0100)flag=1;else if ((afterShift & 0x03ff)==0x0300)flag=1;elseflag=0;return sign + (afterShift>>9) + ((159-shiftLeft)<<23) + flag; }

    代碼解釋:將整形轉(zhuǎn)化為無符號浮點數(shù),即求浮點數(shù)。先取的符號位,再將剩余部分全部取為正數(shù)形式,即absx,即可以得到無符號的數(shù)值。然后將有數(shù)字的部分直接移動到最高位,記錄移動的位數(shù),再將其移動9位(因尾數(shù)只要23即可)。對于階碼部分,由于記錄的是小數(shù)點從31位右數(shù)到第一個1,但實際上需要處理的是從第0位到第一位,所以E=32-shiftleft,bias為127,加上為159,if部分做舍入處理
    15、

    /** float_twice - Return bit-level equivalent of expression 2*f for* floating point argument f.* Both the argument and result are passed as unsigned int's, but* they are to be interpreted as the bit-level representation of* single-precision floating point values.* When argument is NaN, return argument* Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while* Max ops: 30* Rating: 4*/ unsigned float_twice(unsigned uf) {unsigned f = uf;if ((f & 0x7F800000) == 0) //{//左移一位f = ((f & 0x007FFFFF) << 1) | (0x80000000 & f);//007fff---11111111111111111111111 23bit }else if ((f & 0x7F800000) != 0x7F800000){f =f + 0x00800000; //100000 23}return f; }

    代碼解釋:將無符號浮點數(shù)乘2,對無階碼小數(shù),對其尾部乘2即可,即直接左移一位,但要提前記錄符號位。對于規(guī)格化數(shù),直接對其階碼+1即可
    四、實驗結(jié)果及分析:
    1、首先轉(zhuǎn)移dlc所在的目錄之下:

    2、然后使用dlc檢測bits.c是否有錯誤,代碼行為:./dlc bits.c

    結(jié)果顯示沒有錯誤,即書寫規(guī)范
    3、通過使用dlc的-e選項

    顯示各個操作數(shù)符合要求
    4、使用btest檢驗函數(shù)實現(xiàn)代碼的功能正確性,先使用make編譯生成btest可執(zhí)行程序,具體代碼行為:make(make會對當(dāng)前目錄下的所有程序調(diào)用gcc進(jìn)行編譯)

    幾乎所有的.c文件都生成了相對應(yīng)的可執(zhí)行文件:

    5、調(diào)用btest命令檢查bits.c中的所有函數(shù)的功能的正確性,以便下一步查找錯誤原因,指令行為:./btest bits.c

    至此,基本上所有實驗已經(jīng)完成,但我們可以繼續(xù)練習(xí)一下btest的使用,例如測試所有函數(shù)的正確性并打印出錯誤信息。

    結(jié)果基本相同
    或者測試特有參數(shù),如測試所有函數(shù)在不返回錯誤信息的緊湊型模式:

    由于沒有錯誤,所以實際上結(jié)果還是一樣
    或者測試特定函數(shù)名的函數(shù),如./btest -f bitAnd

    至此,實驗的全部內(nèi)容已經(jīng)全部完成。

    總結(jié)

    以上是生活随笔為你收集整理的深入理解操作系统——datalab-handout的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。