1樓:
#define umcs (*((volatile unsigned int *)0xffa0))
定義了一個記憶體地址。c語言直接訪問記憶體地址必須建立一個絕對的記憶體地址指標。
umcs:為這個地址取的巨集名
(*((volatile unsigned int *)0xffa0)):編譯時,代替umcs的內容。最外面的括號是為了防止代替後出現歧義加的,沒有實際意義,實際的是括號裡面的內容:
*((volatile unsigned int *)0xffa0)
*表示一個地址裡面的內容,這個地址是:
(volatile unsigned int *)0xffa0
常數0xffa0就是實際的地址,(volatile unsigned int *)將這個地址轉變成c語言的unsigned int *指標,表明這個地址包含兩個位元組,存放無符號的數。
難以理解的是volatile,這是一個不常用的屬性,表明一個地址裡面的內容會自動改變,這種改變不是c程式改變的,而是外界原因改變的。這些地址,都是硬體的介面,裡面的值是硬體給的。這個volatile,對於c語言是必不可少的,有了這個,下面的語句就會得到正確編譯:
a=umcs;
a=umcs;
沒有volatile,編譯器認為這兩個語句重複,沒有意義,會自動優化成為一句:
a=umcs;
有了volatile,就會保留兩個語句。
實際上,因為umcs是volatile的,這兩個語句,兩次讀取同一地址的內容,但是讀取的值可能是不同的。
其他幾個#define語句意義相同。
主程式中
umcs=0xe038;
lmcs=0x03f8;
pacs=0x403e;
mpcs=0x8038;
cw=0x0080;
cw=0x0000;
向各個介面寫入資料,這些資料實際上是傳送給了硬體(常常是外部裝置)。
while(1)
這個是死迴圈,似乎沒有任何意義。但是,實際是等待中斷。中斷會打斷任何迴圈,跳到相應的中斷處理程式。
這段程式是典型的與硬體通訊的程式,寫驅動程式時,經常用到。
2樓:
你要問什麼?
解釋一下這段**?
請問8086識別c語言嗎,具體用什麼編譯器,燒寫到8086的程式如何生成 請高手解答。 俯首拜謝!不勝感激!
3樓:匿名使用者
不太清楚這位朋友需要達到什麼樣的目標,通俗來說,用c語言程式設計來控制8086是順理成章的事情,比如從前的turboc、後來的borland c,以及現在的vc++等編譯後生成的可執行**都是x86上執行的,如果一定要在8086cpu上執行,則直接指定cpu類別為8086即可,對不?
如果想直接在8086上執行**,由於8086本身不配程式執行空間,則需要配置相應的eprom或eeprom等空間來存放**,至於eprom,怎麼寫入都可以,只要將啟動**放在ffff:0000就可以確保在8086復位後可以順利得以執行。
求大神將下面c語言程式用8086組合語言實現
請問用8086組合語言編寫程式計算1+2+……+100 怎麼寫??求**,謝謝 5
4樓:匿名使用者
dseg segment
result dw 0
dseg ends
cseg segment
assume cs:cseg,ds:dsegstart:
mov ax,dseg
mov ds,ax
;xor ax,ax
mov cx,100
c1:add ax,cx
loop c1
;mov result,ax
;mov ax,4c00h
int 21h
cseg ends
end start
vb程式設計題設計程式求VB程式設計題設計程式求s1234n1n的值並輸出,其中n是從鍵盤輸入大於1的正整數
照樓主的題目,n不是大於1的正整數,應該是大於回1的正偶數才對答吧?private sub mand1 click n val inputbox n if n mod 2 1 then exit subt 1 2 s t for i 3 to n 1 step 2t t i i 1 i 1 i 1 ...
設計程式輸出圖形,設計一個程式輸出圖形
include int main 一個簡單的方法 printf n空一格 空兩格 n空三格 設計c語言程式輸出一下圖形 include main for i 0 i 2 i getch include void main for i 3 i 1 i cout lz給分啊 編寫一個程式,輸出以下圖形 ...
c語言程式解析,C語言程式解析
樓主給的東西不是很完整啊,看看是不是你要的結果。void init 遍歷時顯示每個結點的過程 void drawnode tree t,int color t t p c 號優先順序最高,i 1 時 t t 2 2009 1 2 2 s s t c 優先順序最高 以此類推 所以結果如下 11 2 i...