『壹』 末單元地址為什麼等於首單元物理地址加容量再減一 那求堆棧段在存儲器中的物理地址范圍為什麼不減一
因為第1~n個存儲空間,對應首地址的偏移量為0~n-1。
最簡單的例子,第一個地址(其實也就是首地址)難道要首地址加1?
這是數數的邏輯。
至於物理地址范圍,是首地址~尾地址啊,跟減1不減1有關系么?
『貳』 在8086中定義一個堆棧段其空間最大為多大
由於SP的變化范圍為0000H~FFFFH,(H表示16進制數)
其中需要注意的一點是,當棧滿的時候,SP=0000H (由於8086壓棧是由高地址端(FFFFH)到低地址端(0000H),SP不斷減小),繼續壓棧,SP溢出(不會影響SS),將會讓SP從FFFFH端向0000H端環繞,能夠覆蓋之前的值,也就是絕對地址最大范圍也就和SP的最大范圍相同
SP可以指向的每個單元大小對應1Byte(這個單元大小和SP變化范圍無關),由SP的變化范圍可知SP可表示為16位二進制數,最大容量應該為
2^16Byte=64KB
或者根據共有FFFFH+1個單元,
(FFFFH-0000H+1)*1Bit=10000H(Byte)
=2^16(Byte)
=64KB
絕對地址計算方法(其實和CS:IP的計算方法相同):
StackAddress=StackSegment*16+StackPointer;
其中*16可以表示為二進制數向左移動四位,對應16進制左移一位(加0)就可以了
StackAddress=100F0+01A1
=10291(十六進制)
『叄』 堆棧段為什麼小於等於64KB
一個段,是在段寄存器不變的條件下,偏移地址可變,所確定的范圍。
偏移地址的變化范圍,就是0000H~FFFFH,這就是64K。
不僅僅是堆棧段,其它的段,地址范圍,都是在64K之內的。
『肆』 8086給各寄存器,內存分配的地址范圍是什麼
CPU的物理地址不變,而邏輯地址分配是隨機的,每次載入系統時都不一樣,可以在DOS里查看。對於有16根數據線,20根地址線的8086CPU,將邏輯地址用段基地址和偏移地址表示。段寄存器中的段基地址可以定義任何64KB存儲器的起始地址,偏移量用來在64KB存儲器中任選一單元,每一個段的長度為64KB,地址范圍為(起始地址~起始地址+FFFFH),起始地址為段基地址×10H。
『伍』 在8088系統中,已知當前SS寄存器的內容為2345H,SP的內容為0100H,請說明該堆棧段在存
二、填空171.在8086/8088系統中,存儲器物理地址是分段組織的。堆棧段的段地址存放在(ss)寄存器中,棧頂數據的偏移地址放在(sp)寄存器中。代碼段的段地址存放在(cs)寄存器中。2.偽指令DBN,N為有符號數時,要使該指令合法,則N的最大值是(127)D,最小值是(-128)D。3.(CS)=6000H,(DS)=3000H,(ES)=4000H,(SS)=5000H,(DI)=A100,操作數[DI+1000H]的定址方式是(寄存器相對定址),物理地址是(3B100h)。4.CMP指令的功能是(用操作數1減去操作數2然後根據結果設置標志積存器)。5.指令MOV.AX,[SI+100H]的具體操作是(把ds*16+si+100h的內存地址中的16位數據存入ax)。6.無符號二進制位元組數可表示的數的范圍是(0~255)。7.執行一條POPBX指令後,SP的內容發生的變化是(增加10h)。8.AL寄存器的內容為08H,執行指令OR.AL,30H後,AL的值為(38h)。9.測試寄存器AL和BL的值是否相等而不改變其值應使用指令(CMPAL,BL)。10.二進制數01000001,若將該數分別看作是ASCII碼字元,是(A),補碼表示的帶符號數,它對應的十進制數的真值是(191)。11.標志寄存器FLAGS中ZF標志位的主要作用是(測試各種操作的結果是否為0)。12.使匯編程序把4142H存入一個存儲器字中。可以用以下幾種等價方法實現要求:(movax,4142h),(movah,41hmoval,42h),(movax,0100000101000010b)。13.XORAX,AX執行後AX=(0),CF=(0),OF=(0)。14.舉出使得CF=0的三條指令。movax,0xorax,axandax,0FFFFh(這樣算不算?)15.指令LOOPAGAIN的功能(deccxcmpcx,0jneAGAIN)。16.AX=FFFFH,執行指令NEGAX後,AX=(0)H。17.AL=39H,執行指令ANDAL,0FH後AL=(9)H。三、判斷以下各語句是否有錯誤,如有錯誤請說明錯誤原因201.MOVAL,100正確2.MOV[1000H],100H錯誤,非法指令3.MOVBL,AX錯誤,寄存器長度不相等4.MOV[100],AX錯誤,目標操作數段寄存器不明確5.POPPSW錯誤,非法指令6.SHLDX,BL錯誤,第二個操作數必須為1或CL7.MULAL,BL錯誤,MUL指令只能有一個操作數8.ANDAX,[1000]正確9.XCHGCS,ES錯誤,CS不能參與交換10.LDSAL,[SI]錯誤,第一個操作數必須為16位通用寄存器11.ROLAL,4正確12.LEABX,TABLE正確13.MOVAL,FFH錯誤,moval,0ffh14.PUSHDS正確15.ASSUMECS:CODE;DS:DATA如果後面是注釋,正確,否則錯誤,應改;為,16.DW0FFH,-12,127正確17.XORCL,CL正確18.ADD55H,AL錯誤,非法操作數19.CMP[100H],[200H]錯誤,同上20.ORAL,80H正確
『陸』 C中棧的內存有多大!
棧的內存空間大小是可以自己定義的,沒規定多大,但是一個棧段的容量最大為64KB
因為一個棧段最大容量為65536位元組,除以1024就是64KB
『柒』 8086/8088系統中,存儲器為什麼要分段,一個段的最大和最小各為多少位元組
8086/8088系統中,存儲器分段的主要目的是便於存儲器的管理,使得可以用16位寄存器來定址20位的內存空間。一個段最大為64KB,最小為16B。
存儲器一般用來保存程序的中間結果,為隨後的指令快速提供操作數,從而避免把中間結果存入內存,再讀取內存的操作。
由於存儲器的個數和容量都有限,不可能把所有中間結果都存儲在存儲器中,所以,要對存儲器進行適當的調度。根據指令的要求,管理安排適當的寄存器,避免操作數過多的傳送操作。
8086/8088CPU可直接定址1MB的存儲器空間,直接定址需要20位地址碼,而所有內部寄存器都是16位的,只能直接定址6KB,因此採用分段技術來解決。將1MB的存儲空間分成若干邏輯段,每段最長64KB,最短16B。這些邏輯段在整個存儲空間中可浮動。
(7)棧段存儲范圍擴展閱讀:
8086/8088CPU內部設置了4個16位段寄存器,它們分別是代碼段寄存器CS、數據段寄存器DS、堆棧段寄存器SS、附加段寄存器ES、由它們給出相應邏輯段的首地址,稱為「段基址」。段基址與段內偏移地址組合形成20位物理地址,段內偏移地址可以存放在寄存器中,也可以存放在存儲器中。
程序較小時,代碼段、數據段、堆棧段可放在一個段內,即包含在64KB之內,而當程序或數據量較大時,超過了64KB,那麼可以定義多個代碼段或數據段、堆棧段、附加段。
『捌』 某系統中已知當前SS=2580H,SP=0800H,請說明該堆棧段在存儲器中的物理地址范圍。若已知當前堆棧中已存有1
只能知道當前堆棧段的物理地址,ss*16+sp=26000H,sp=0時為棧底,物理地址為25800H
堆棧段最大不超過64k,該堆棧段的段地址為2580H,偏移地址范圍最大為0000H-0ffffH
物理地址=段地址*10H+偏移地址
我只能這樣理解你的意思,當前sp=0800,若再向堆棧中壓入10個位元組的數據,sp的內容為多少
此時sp的內容為0800H+10=080AH
『玖』 匯編語言中,堆棧段是否只能定義大於16個位元組大小的空間,能否定義少於16個位元組的空間
在 8088/8086 系統中,每個段最小是16位元組,最大是64K位元組。
選用不同的大小范圍,都要以 16 位元組的整數倍進行。
因為,在計算物理地址的時候,有一個「「段地址乘以16」」的步驟。
『拾』 堆棧段可存放多少個16位的字
8086系統把1M的內存空間劃分為若干個邏輯段,每個邏輯段容量為64KB,SS是堆棧段,那麼它可以存放1024*64Byte,也就是有6553Byte,共32768個16位的字。