導航:首頁 > 源碼編譯 > 怎麼查看編譯環境是否為小端模式

怎麼查看編譯環境是否為小端模式

發布時間:2022-02-01 18:54:51

編譯環境中的大小端

常用在嵌入式開發中以適應目標系統
大端:MSB,數據高位元組放在高地址,低位元組放在低地址
小端:LSB,與MSB相反
X86架構為LSB
ARM MSB,LSB均可,通過片外邏輯確定

㈡ 編譯器能指定大小端么

大端模式,是指數據的高位元組保存在內存的低地址中,而數據的低位元組保存在內存的高地址中
小端模式,是指數據的高位元組保存在內存的高地址中
而數據的低位元組保存在內存的低地址中
上面c是一個共用體,給共用體中的a賦值為1.然後讀取b是否為1,當b為1是說明是小端模式,b為0則說明是大端模式。

㈢ 如何看linux是否為c++編譯環境

我這里提出的開發環境的只是我個人喜歡的,並不一定是最好的,僅供參考。以下都以我的系統為准: Fedora Core2, gnome。 1:linux下的 軟體安裝。 在linux下安裝有兩種方法:自己編譯源代碼安裝和用RPM安裝。一般軟體都提供了RPM包下載。

㈣ 怎樣判斷處理器或者編譯器大小端對其的方法


16bit的機器誕生後,數據的存放也是按照位元組為單位的,也是8bit位,這時候的問題就來了,過去8bit機器是一個地址一個位元組,現在一個地址可以存放2個位元組的數據了,其中該地址又分為高8位和低8位,2個位元組怎麼分配到高8和低8,這是一個選擇題。於是2中流派就產生了,數據的邏輯低存到低8,邏輯高存到高8;或者是數據的邏輯低存到高8,邏輯高存到低8.用具體的數

㈤ 大端模式、小端模式和MSB、LSB是一個概念嗎兩者有何區別

在網路通信方面,大家說的更多的 是:「Big-Endian」和「Small-Endian」的問題。
指的都是對於多位元組的數據類型(比如4位元組的32位整數),其多個位元組的順序問題,是最高位元組在前(Big-Endian)還是最低位元組在前 (Small-Endian)。
比如對於123456789這個整數,其16進制為0x075BCD15,那麼按照Big-Endian的方式,它在網路上傳輸(或者在內存里存儲)的4 個位元組依次是:07 4B CD 15,而Small-Endian的順序正相反,是:15 CD 4B 07。

MSB 和LSB 雖然跟這個事情看起來有點相似,但不是一回事。通常,一個晶元的管腳中,對於一個多 比特的信號,比如32根的地址線,從低開始按0到31編個號。MSB 就是31,LSB 就 是0。那麼如果標記為:ADDR[31:0]就是MSB first的方式,如果標記為ADDR[0:31]就是LSB first的方式。

㈥ 虛擬機linux怎麼查看交叉編譯環境

1.安裝源碼編譯環境(配置gcc),在ubuntu安裝完成已經有gcc(gcc是由GNU之父Stallman所開發的linux下的編譯器,全稱為GNU Compiler Collection, 目前可以編譯的語言包括:C, C++, Objective-C, Fortran, Java, and Ada.),但是gcc還不能編譯文件,因為缺少一些頭文件.那麼我們就要來配置這些頭文件。在這里我們需要安裝build-essential這個軟體包,安裝了這個包會自動安裝上g++,libc6-dev,linux-libc-dev,libstdc++6-4.1-dev等一些必須的軟體和頭文件的庫。安裝build-essential,你可以在新立得搜索然後安裝或者在終端里輸入:
sudo apt-get install build-essential

2.除了編輯器之外,我們還需要文本編輯器來編寫程序源碼,Ubuntu中其實已自帶編輯器,但是目前較為著名而且流行的vi / vim 編輯器可以通過在Ubuntu的軟體中心下載,或是在終端輸入指令下載,指令如下:
sudo apt-get install vim-full

3.解壓包:arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2,(註:不同文件包類型,指令有區別,如bz2 -xf)如下指令:
sudo tar -xf arm-linux-gcc-3.4.5-glibc-2.3.6.tar.bz2 OR sudo tar -xf arm-linux-gcc-3.4.6-glibc-2.3.6.tgz -C /work/

我的Ubuntu使用第二個指令解壓後解壓包放在了work目錄下。

4.修改環境變數,把交叉編譯器的路徑加入到PATH:方法一:修改/etc/bash.bashrc文件(此文件只對當前用戶適用),指令如下:
sudo gedit /etc/bash.bashrc
然後在文件的末尾空白處加入一下代碼:
if [ -d /work/gcc-3.4.6-glibc-2.3.6 ] ; then
PATH=/work/gcc-3.4.6-glibc-2.3.6/arm-linux/bin:"${PATH}"
fi
即完成路徑的添加。

5.使新的環境變數生效,不用重啟電腦。輸入下面指令:
source /etc/bash.bashrc
6.檢查是否將路徑加入到PATH。輸入下面指令:

echo $PATH
若顯示的內容中含有:/usr/local/arm/4.3.2/bin 說明已經將交叉編譯器的路徑加入PATH。至此,交叉編譯環境安裝完成。

7. 測試是否安裝成功,下面的命令會顯示arm-linux-gcc信息和版本。

㈦ 大小端模式的簡介

所謂的大端模式(Big-endian),是指數據的高位元組,保存在內存的低地址中,而數據的低位元組,保存在內存的高地址中,這樣的存儲模式有點兒類似於把數據當作字元串順序處理:地址由小向大增加,而數據從高位往低位放;
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在大端模式下,前32位應該這樣讀: e6 84 6c 4e ( 假設int佔4個位元組)
記憶方法: 地址的增長順序與值的增長順序相同 所謂的小端模式(Little-endian),是指數據的高位元組保存在內存的高地址中,而數據的低位元組保存在內存的低地址中,這種存儲模式將地址的高低和數據位權有效地結合起來,高地址部分權值高,低地址部分權值低,和我們的邏輯方法一致。
例子:
0000430: e684 6c4e 0100 1800 53ef 0100 0100 0000
0000440: b484 6c4e 004e ed00 0000 0000 0100 0000
在小端模式下,前32位應該這樣讀: 4e 6c 84 e6( 假設int佔4個位元組)
記憶方法: 地址的增長順序與值的增長順序相反 對於0x11223344 儲存如下
下面這段代碼可以用來測試一下你的編譯器是大端模式還是小端模式:
short int x;
char x0,x1;
x=0x1122;
x0=((char*)&x)[0]; //低地址單元
x1=((char*)&x)[1]; //高地址單元
若x0=0x11,則是大端; 若x0=0x22,則是小端......
上面的程序還可以看出,數據定址時,用的是低位位元組的地址。 #definesw16(x)((short)((((short)(x)&(short)0x00ffU)<<8)|(((short)(x)&(short)0xff00U)>>8)))

㈧ 如何查看linux環境的大小端

不同機器內部對變數的位元組存儲順序不同,有的採用大端模式(big-endian),有的採用小端模式(little-endian)。 大端模式是指高位元組數據存放在低地址處,低位元組數據放在高地址處。 小端模式是指低位元組數據存放在低地址處,高位元組數據放在高地址處。...

㈨ 如何判斷CPU是大端模式還是小端模式

大端模式和小端模式與處理器沒關系,是編譯器的怎麼處理的。看看編譯器的設置裡面,一般都有相關的選項,即使編譯器沒有選項供選擇,編譯器的說明書中也會介紹。
想測試的話,最簡單的是做個小程序,定義一個整形或長整形的變數,從調試環境中看一下這個變數就知道了。

㈩ 大小端模式的判斷處理器

通過下列的程序可以確認在某個硬體平台上的某個操作系統是大端還是小端:
VB6: '注意這個CopyMemory的聲明與一般的不一樣,'一般的都是(pDstAsAny,pSrcAsAny,ByValByteLenAsLong)'為了能夠逐位元組訪問u,所以前面兩個參數改成了按值傳遞,配合VarPtr函數獲取變數地址_RtlMoveMemory(ByValpDstAsLong,ByValpSrcAsLong,ByValByteLenAsLong)PrivateSubForm_Load()'VB的Integer佔用2個位元組!Long才是4個位元組'32位應用程序的指針是4個位元組sLong'儲存u從低地址到高地址的4個位元組=367328153'十六進制數:15E4FB99uptr=VarPtr(u)'VarPtr函數是內置函數,但是msdn不說,作用是獲取變數的地址aptr=VarPtr(a)bptr=VarPtr(b)cptr=VarPtr(c)dptr=VarPtr(d)CopyMemoryaptr,uptr+0,1'將u逐位元組按順序寫入a,b,c,dCopyMemorybptr,uptr+1,1CopyMemorycptr,uptr+2,1CopyMemorydptr,uptr+3,1'Windows系統,英特爾處理器:最後輸出的是99FBE415MsgBoxHex(a)&&Hex(b)&&Hex(c)&&Hex(d)EndSub在英特爾處理器,Windows10操作系統上,對話框顯示的結果是99 FB E4 15,與直接求出來的16進制值15 E4 FB 99正好相反,所以是小端的。
C++語言(VS2013下,控制台項目): #include<iostream>usingnamespacestd;typedefunsignedcharbyte;//轉換char(視為整數類型)為16進制字元串voidChtoHex(byteVal,char*dest){//輾轉相除法,倒序看得到結果bytetmp=Val%16;if(tmp>=0&&tmp<=9){dest[1]='0'+tmp;}elseif(tmp>=10&&tmp<=15){dest[1]='A'+tmp-10;}tmp=(Val/16)%16;if(tmp>=0&&tmp<=9){dest[0]='0'+tmp;}elseif(tmp>=10&&tmp<=15){dest[0]='A'+tmp-10;}//設置''dest[2]='';}//主函數intmain(){intu=367328153;//原始數據,8位16進制為15E4FB99bytea,b,c,d;//u從低地址到高地址的四個位元組//a~d對應的16進制字元串,預留3個字元charSa[3],Sb[3],Sc[3],Sd[3];byte*k=(byte*)&u;a=k[0];b=k[1];c=k[2];d=k[3];//轉成16進制字元串ChtoHex(a,Sa);ChtoHex(b,Sb);ChtoHex(c,Sc);ChtoHex(d,Sd);cout<<Sa<<<<Sb<<<<Sc<<<<Sd<<endl;system(pause);return0;}在英特爾處理器,Windows10操作系統上,控制台顯示的結果是99 FB E4 15,與直接求出來的16進制值15 E4 FB 99正好相反,所以也證明是小端的。
C語言(VC++6.0,控制台工程): #include<stdio.h>typedefunsignedcharbyte;//轉換char(視為整數類型)為16進制字元串voidChtoHex(byteVal,char*dest){//輾轉相除法,倒序看得到結果bytetmp=Val%16;if(tmp>=0&&tmp<=9){dest[1]='0'+tmp;}elseif(tmp>=10&&tmp<=15){dest[1]='A'+tmp-10;}tmp=(Val/16)%16;if(tmp>=0&&tmp<=9){dest[0]='0'+tmp;}elseif(tmp>=10&&tmp<=15){dest[0]='A'+tmp-10;}//設置dest[2]='';}//主函數voidmain(){intu=367328153;//原始數據,8位16進制為15E4FB99bytea,b,c,d;//u從低地址到高地址的四個位元組//a~d對應的16進制字元串,預留3個字元charSa[3],Sb[3],Sc[3],Sd[3];byte*k=(byte*)&u;a=k[0];b=k[1];c=k[2];d=k[3];//轉成16進制字元串ChtoHex(a,Sa);ChtoHex(b,Sb);ChtoHex(c,Sc);ChtoHex(d,Sd);printf(%s%s%s%s ,Sa,Sb,Sc,Sd);scanf_s(%d,&a);}在英特爾處理器,Windows10操作系統上,結果跟上面是一樣的,輸出的16進制數是反序的,證明是小端系統。
C#(VS2013下,控制台項目): usingSystem;namespaceConsoleApplication1{classProgram{staticvoidMain(string[]args){intu=367328153;//原始數據,8位16進制為15E4FB99byte[]bytes;//u從低地址到高地址的四個位元組//獲取bytes=System.BitConverter.GetBytes(u);Console.WriteLine(bytes[0].ToString(X)++bytes[1].ToString(X)++bytes[2].ToString(X)++bytes[3].ToString(X));Console.ReadLine();}}}在英特爾處理器,Windows10操作系統上,結果跟上面還還是一樣的,輸出的16進制數是反序的,證明是小端系統。
MDK(Keil5,STM32F407)C語言: #includestm32f4xx.hintmain(void){intu=367328153;//原始數據15E4FB99int*k=&u;return0;}編譯連接然後下載到開發板上,然後啟動調試,通過監視窗口可以看到u的地址,然後在內存窗口可以看到位元組序是反序的,所以說明STM32F407是小端的。據某些資料說ARM內核是可以設置大小端的,但是STM32是外設自動進入了小端,似乎是無法調整的。

89C52(Keil5)C語言:
最後來一個大端的例子。手頭上沒有51的開發板,所以用的是軟體模擬。 #include<reg52.h>intmain(){intlongbit=sizeof(long);longu=367328153;//原始數據15E4FB99long*k=&u;return0;}注意看了,C52是8位的處理器,long才是4個位元組的,看監視窗口longbit的值就知道了(紫色框)。然後再看內存窗口,就會發現u的存儲是跟原始數據給的順序是一樣的,所以C51和C52是大端的!!

閱讀全文

與怎麼查看編譯環境是否為小端模式相關的資料

熱點內容
linuxvi下一個 瀏覽:973
安卓手機的應用鎖怎麼解 瀏覽:733
linux增加路徑 瀏覽:845
sql身份證號最後四位加密 瀏覽:533
xp系統表格加密 瀏覽:854
光遇安卓軍大衣什麼時候上線 瀏覽:838
android應用商店圖標 瀏覽:341
java計算圓的面積 瀏覽:643
應用編譯優化recovery 瀏覽:577
域控命令n 瀏覽:258
php導出文件 瀏覽:13
谷歌地圖網頁版無法連接伺服器地址 瀏覽:298
菜鳥工具在線編譯python 瀏覽:858
柵格化命令有何作用 瀏覽:823
為什麼壓縮文件不能解壓 瀏覽:311
足球app哪個軟體好 瀏覽:96
產品經理逼瘋程序員的一天 瀏覽:17
修改svn伺服器ip地址 瀏覽:584
下列關於編譯說法正確的是 瀏覽:246
java馬克思 瀏覽:118