1樓:匿名使用者
bx為例,其實體地址 = ds*16+bx。但你算這個值沒什麼用,因為所有的暫存器都是16位的,放不下這麼大的值。
樓上關於「段是若干棟樓,偏移量是門牌號」的比喻不太準確,因為一個實體地址可以由不同的段址+偏移量組合來訪問。建議這樣來理解,記憶體是一條長長的直路,偏移量是眼睛的視力範圍,太遠就看不見了。而段就是腳下所站的位置,原來看不見的地方往前走一段距離就能看見了。
2)答:沒太弄懂你的問題。記憶體是可以隨機存取的(所以叫ram),進入記憶體還要什麼次序麼?
3)答:cpu一次操作只能存取[0,1]或[2,3]或[4,5]這樣的記憶體內容。如果你在[1,2]中放一個字,cpu就只能先存取[0,1],然後把[1]留下,再存取[2,3],最後把留下的[1]與[2]合併後給你。
0001:0000的實體地址為00010
0010:0100的實體地址為00200
0100:f000的實體地址為10000
1000:2345的實體地址為12345
方法很簡單,將段地址左移一個16進位制位(相當於乘16)再與偏移量相加即可。
2樓:匿名使用者
1.記憶體空間分成若干個段,每個段由若干個位元組組成,如果想找到一個實體地址,首先要找到該地址所在段的段地址,然後再加上偏移量就可以了。你可以這樣理解。
記憶體是一個小區,段是若干棟樓,偏移量是門牌號。
2、對於一個棧,top指標是越來越小的。
3、你說的那種情況不會出現,作業系統分配記憶體空間的時候會把那個多餘的地址空下來。
3樓:網友
存入暫存器後:
上面32是低位,下面65是高位。
與棧是類似的。只是把兩個(如32)當作一個數來進棧而已。
關於組合語言的一個問題
c語言和組合語言的關係?
4樓:吉祥二進位制
程式設計師編寫的c語言**,首先要經過c語言編譯器,生成彙編**,這個過程稱為編譯階斷,當c語言編譯器生成彙編**後,再呼叫匯編器來將彙編**編譯成彙編指令。
這是一種站在巨人肩人的作法,最早的c++程式語言也是這樣的實現方法,只不過那時候叫cfront程式,cfront程式的作用是將c++**轉換成c語言**,類似於一個文字處理器,然後再呼叫c語言編譯器,將c原始碼編譯成彙編**,然後再呼叫匯編器將彙編**編譯成機器碼。
這個過程,在windows平臺上不容易操作,但是在linux平臺上很容易看到。以gcc這款c語言編譯器為例,它實際上是四個小程式。
cp: c語言預處理程式,有它負責進行預處理操作。
cc: c語言編譯器,它負責將c原始碼編譯成彙編**。
as: 彙編器,它負責將彙編**編譯成機器碼,一般使用gcc 這樣的命令編譯c語言時,會生成一個a.
out的程式,它實際上指的就是as ouput,即彙編器輸出檔案。
link: 連結器,它負責將彙編器輸入的機器碼和庫打包成一個作業系統可以執行的可執行檔案,在linux上的可執行檔案格式是elf格式,這個格式的實現是有連結器來完成的。
5樓:匿名使用者
編譯了以後地址確實是確定的,但作業系統會把它對映到實體地址上,所有每次執行的實體地址都不同。
「還有,我發現這三個地址之間都差4,是不是相當於彙編裡面,在資料段中這三個變數是連續定義的,所以地址也是連續的,並且說明了c語言中int型別的變數佔4個位元組,int的指標型別。
也佔4個位元組。」
是的,確實是這樣編譯的。int是32位的,就是4個位元組了。32位系統的地址是32位的,指標就要4位元組。
「還有一個問題。。
c語言中分配記憶體空間的一個語句是:
int *p = null;
p = int *)malloc(sizeof(int)*100);
是在堆裡面分配的空間,可是在彙編裡面只有**段,資料段,堆疊段,還有附加段,"堆" 在那個段中?
我一直認為「堆疊」就是「棧」的意思,難道說「堆疊」是。
「堆」+「棧」??
作業系統管理堆記憶體,怎麼實現的和系統有關吧。「堆疊」就是指棧記憶體。32位系統中ds,cs,es,都和16位系統有很大差別,具體看看cpu的保護模式,在32位系統中,堆在那個段中這種說法很難解釋。
還有,在8086cpu中,暫存器是16位的,所以偏移地址是16位的,所以一個段最大就是64kb,如果我在malloc函式里面寫:
int *p = null;
p = int *)malloc(sizeof(int)*1000000000000000000);
也就是說開闢了一個大於64kb的堆空間,會有什麼後果?
那是16位計算機,現在的32位系統段大小是4g,64位就更大了(一言兩語說不清楚)。
學習c語言不應考慮是怎麼實現的,c是個高階語言。它把計算機系統抽象了出來,把計算機看成是圖靈機,不同的系統上實現方法不同,所以學習c不應該去想它的彙編實現。實現細節就交給編譯原理和作業系統這兩門課吧。
6樓:霍興有藺卿
區別是很大的。c語言作為一種高階程式語言,是比較容易被人所理解的,但要經過編譯器的編譯,形成機器所能夠理解的組合語言,才能夠被機器所理解。這兩種語言的語法結構也很很大的差異。
c語言的語言你可能已經瞭解一些了,那麼我簡單說說組合語言。組合語言(assembly
language)是面向機器的程式設計語言,實際上它是把機器碼用助詞符表示出來而形成的,它的語法結構一般為:操作碼+運算元1+運算元2
以下是一個簡單的彙編程式例子:
start:in
al,20h
movbl,al
inal,30h
movcl,al
movax,0
adlop:
addal,bl
adcah,0
deccljnzadlop
hlt以上,每行是一個語句。可見,與c語言差別很大。
有關組合語言的疑問。
7樓:匿名使用者
你的問題搞清楚地址概念和定址方式就迎刃而解了。
(al)=(20000h),則(20000h)得到的資料為位元組型。這段話中(20000h)處的資料可以是0到255間的任意資料,就只有一個位元組存在這裡。
8樓:做而論道
20000h,是一個地址號碼。
20000h,指定了,儲存器中的,某一個儲存單元。
按照題意,在這個儲存單元中,存放了 8 位數,即一個位元組。
(20000h),是指 20000h 單元中的內容,即 8 位數,即一個位元組。
(al) 是指 al中的內容,它也是 8 位數,即一個位元組。
有關組合語言的問題。
9樓:網友
這是組合語言,電子工程,第三個我就不知道了。
10樓:網友
1、是2、看你的例子這是一個intel8086/8088的組合語言示例,對於瞭解系統、深入核心研究方向的學習,這是入門的基礎知識。
3、能,以後你會發現。
有關組合語言的問題
11樓:網友
assume cs:code
code segment
start: mov ah,1
int 21h ;輸入字元。
cmp al,30h ;與「0」比較jb hc ;小,轉hc
cmp al,39h ;與「9」比較ja zm ;大,轉zm
mov dl,al ;是數字,原樣顯示mov ah,2
int 21h
jmp start ;等待輸入其他字元hc: cmp al,0dh ;輸入的字元是不是回車jz stop ;是,結束。
jmp start ;不是,等待輸入zm: and al,11011111b ;判斷是不是字母,先轉換成大寫字母。
cmp al,41h ;與「a」比較jb start ;小,則不是字母,轉start繼續輸入cmp al,5ah ;與「z」比較ja start ;大,則不是字母,轉start繼續輸入mov dl,'c' ;是字母,顯示cmov ah,2
int 21h
jmp start ;轉start繼續輸入stop: mov ax,4c00hint 21h
code ends
end start
關於組合語言的幾個問題!!
12樓:冠月朗
and bl,[0ffh];目的運算元為暫存器定址,源運算元為直接定址。
b. cmp [si],cx;目的運算元為暫存器間接定址,源運算元為暫存器定址。
c. push ds;源運算元為暫存器定址。
d. cmc;無運算元。
2. lea;取記憶體的有效地址。
lds;將記憶體中的一個雙字取到暫存器和段暫存器。
xchg;交換指令。
3. mov [bp][di],cx 這樣指令的實體地址怎麼算?
其中(ds)=091dh,(bp)=0024h,(di)=0032h,(cx)=5678h
此題中偏移地址為bp+di=0024h+0032h=0056h
實體地址=段地址×10h+偏移地址=(ss)×10h+0056h
13樓:網友
正在學習彙編,也不太會。
14樓:匿名使用者
也正在學彙編 試著寫一下 不知道對不 希望有大蝦幫忙更正1a 直接定址方式。
b 暫存器間接定址。
c 暫存器相對定址。
d 立即定址。
2lea:一個特殊的乘加運算指令。
lds 這個我不知道。
xchg:應該是個目的源功能 將一個位元組或一個字的源運算元和目的運算元相交換。
30091d+0024+0032+5678=0e89eh
有關組合語言的問題 25
15樓:匿名使用者
就是把 bx 的內容送到 ax 裡,你可以把bx看成是一個地址,送出去的是這個地址裡面的內容。
16樓:手機使用者
如果bx是2010h
就是地址為2010h的記憶體值關ax
cx暫存器保留用作計數器。
關於組合語言移植性的問題,關於組合語言中的LOOP指令
兄弟,你理解錯了,首先你要明白,組合語言是一種針對具體機器的低階語言,這裡說的不同機器一般來講是指cpu指令系統不相相容的兩種機器,比如常用的8086與51,dsp,arm,等等,他們的指令系統都不是通用的。自然移植到別的機器上不行,舉個例子來說吧,假如51,的p0埠可以用來點亮一盞燈,但是對808...
有關組合語言指令的問題
mov al,ebx 將ebx為地址中的內容放到al中,其中ebx為32位元暫存器,只使用低16位 mov eax,table bx 應該是talbe bx 吧,就是把段地址為table,偏移地址為bx的內容放到eax中,同上,只使用低16位 mov ax,ebx esi 將偏移地址ebx與變址es...
什麼是組合語言,什麼是彙編和組合語言?
叢依波弘瀾 組合語言 assembly language 是面向機器的程式設計語言。在彙編語閤中,用助記符 memoni 代替操作碼,用地址符號 symbol 或標號 label 代替地址媽。這樣用符號代替機器語盲的二進位制碼,就把機器語音變成了組合語言。於是組合語言亦稱為符號語言。使用組合語言編寫...