當前位置:首頁 » 存儲配置 » 8086中字元串存儲

8086中字元串存儲

發布時間: 2022-04-21 12:22:51

Ⅰ 8086匯編語言問題

***********************
更新的說明在後面
***********************
你的問題很含糊
1. 輸入一個16進制數
如何輸入?從鍵盤嗎?如果是,那本身就已經是ASCII編碼了
如果不是,那就不應該叫輸入,而應說成是給定一個數
2. 16進制數
那是什麼含意?在計算機的存儲器中存入的都是二進制數,
而我們人不習慣二進制,於是就已10或16進制給出他們或者讓計算機把它們表示出來。
如我們要在某些內存單元存儲一些數據:包括二進制的10010110,十進制的96,十六進制的96(即95H=十進制的142),那麼它們在內存裡面對應的是什麼樣子呢?
如果只允許存放在一個存儲單元內,即一個位元組,那麼,
1. 二進制數只能直接存入,即該存儲單元8個二進制位分別為10010110;
2. 對於十進制的96,則可以有兩種形式:壓縮BCD和二進制,該存儲單元8個二進制位分別對應1001(9)0110(6) 和 01100000 = 2的6次方 + 2的5次方 =64 + 32 = 96 ;
3. 對於十六進制的96(即96H=十進制的142, 實際上也就是二進制的10010110),和二進制完全一樣存儲
如果允許存放在多個存儲單元內,即多個位元組,那麼,
1. 二進制數可以一個位存放在一個單元,共需要8個位元組即8個單元,如果直接把每一位的值存入該單元,則每個單元僅用了其中的一位(其餘各位為0),如果存入的值每一位值的ASCII碼,則每個單元分別存放的是字元 '1' '0' '0' '1' '0' '1' '1' '0' ;
2. 對於十進制的96,則可以1).非壓縮BCD,一個位元組存入9,一個位元組存入6,即00001001 和 00000110;2). 字元串,分別存入字元『9』和字元『6』,分別是00111001和00110110
3. 對於十六進制的96,此處同十進制。

************************************************************************
* 綜上,你的這個轉換,首先需要說明你的輸入數據格式,然後才能說如何轉換 *
************************************************************************

Ⅱ 8086匯編語言中如何清空緩沖區里的字元串

最簡單的就是往那個緩沖區送一堆零過去,通常將CX設置成緩沖區的長度,將AL清零,然後使用重復字元串操作指令來清空緩沖區:
MOV
CX,
LEN
;緩沖區的長度,以位元組為單位
LEA
DI,
STR_BUFF
;緩沖區首地址送如
DI
寄存器
XOR
AL,
AL
;AL
清零
REPZ
STOSB
;重復至CX等於0
如果緩沖區巨大,可以送字過去,這樣可以加快運行速度:
MOV
BX,
LEN
;緩沖區長度
MOV
CL,
2
SHR
BX,
CL
;緩沖區長度除以2,得到緩沖區的字長度
MOV
CX,
BX
;送入CX計數器
LEA
DI,
STR_BUFF
;字元串緩沖區首地址送如DI寄存器
XOR
AX,
AX
;AX寄存器清零
REPZ
STOSW
;重復至CX等於0
有時候還要考慮緩沖區是奇數,即緩沖區執行上訴代碼後,還有一個位元組沒有處理,這時候,需要多加幾句。
XOR
DX,
DX
MOV
BX,
LEN
TEST
BX,
1
JZ
L1
MOV
DX,
0FFH
;做標記,指明字元串是奇數
L1:
MOV
CL,
2
SHR
BX,
CL
;緩沖區長度除以2,得到緩沖區的字長度
MOV
CX,
BX
;送入CX計數器
LEA
DI,
STR_BUFF
;字元串緩沖區首地址送如DI寄存器
XOR
AX,
AX
;AX寄存器清零
REPZ
STOSW
;重復至CX等於0
CMP
DX,
0FFH
JNZ
EXIT
STOSB
EXIT:
......
還有許多其他的方法,但是效率最高的就是這個了,其他利用LOOP等循環指令或CMP
CX,
0,JNZ
xx
這種方法速度都要慢一下。

Ⅲ 字元串在內存中怎麼儲存

    字元串是以ASCII字元NUL結尾的字元序列。
ASCII字元NUL表示為\0.字元串通常存儲在數組或者從堆上分配的內存中。只是,並不是全部的字元數組都是字元串,字元數組可能沒有NUL字元。
字元數組也用來表示布爾值等小的整數單元,以節省內存空間。

    C中有兩種類型的字元串:
     單位元組字元串
     由char數據類型組成的序列
     寬字元串
     由wchar_t數據類型組成的序列
     wchar_t數據類型用來表示寬字元,要麼是16位寬。要麼是32位寬。這兩種字元串都以NUL結尾。能夠在string.h中找到單位元組字元串函數。而在wchar.h中找到寬字元串函數。寬字元主要用於非拉丁字元集,對於支持外語的應用程序非常實用,
     字元串的長度是字元串中除了NUL字元外的字元數。為字元串分配內存的時候,要記住為全部的字元加上NUL字元分配足夠的空間。

Ⅳ 匯編語言字元竄存儲

字元串在內存中以位元組(byte)為單位存儲,字元串包含多少字元就需要多少byte來存。匯編中定義一個字元串如下:

myStringBYTE"ABCDEF",0;常以0作為字元串的結尾

內存中存儲順序如圖所示,從箭頭開始,依次向下。假設第一個地址是0000h,下一個byte的地址就是00001h,依次類推。內存中存儲的是字元的二進制編碼,比如A41h=01000001b

希望對LZ有用~

PS:2L說的是英特爾架構CPU的「小尾順序」規則,其他一些CPU可能採用「大尾順序」

比如定義一個字(WORD):myWordWORD1234h如果是小尾順序,那低地址存34h,高地址存12h,如圖中0000h的地方存34h,00001h的地方存12h。大尾順序則相反~(汗。。。。但願不顯得太羅嗦)

Ⅳ 8086中字元串操作使用的變址寄存器是什麼

SI,源變址,
DI,目的變址。

Ⅵ 8086/8088系統中,存儲器為什麼要分段,一個段的最大和最小各為多少位元組

8086/8088系統中,存儲器分段的主要目的是便於存儲器的管理,使得可以用16位寄存器來定址20位的內存空間。一個段最大為64KB,最小為16B。

存儲器一般用來保存程序的中間結果,為隨後的指令快速提供操作數,從而避免把中間結果存入內存,再讀取內存的操作。

由於存儲器的個數和容量都有限,不可能把所有中間結果都存儲在存儲器中,所以,要對存儲器進行適當的調度。根據指令的要求,管理安排適當的寄存器,避免操作數過多的傳送操作。

8086/8088CPU可直接定址1MB的存儲器空間,直接定址需要20位地址碼,而所有內部寄存器都是16位的,只能直接定址6KB,因此採用分段技術來解決。將1MB的存儲空間分成若干邏輯段,每段最長64KB,最短16B。這些邏輯段在整個存儲空間中可浮動。

(6)8086中字元串存儲擴展閱讀:

8086/8088CPU內部設置了4個16位段寄存器,它們分別是代碼段寄存器CS、數據段寄存器DS、堆棧段寄存器SS、附加段寄存器ES、由它們給出相應邏輯段的首地址,稱為「段基址」。段基址與段內偏移地址組合形成20位物理地址,段內偏移地址可以存放在寄存器中,也可以存放在存儲器中。

程序較小時,代碼段、數據段、堆棧段可放在一個段內,即包含在64KB之內,而當程序或數據量較大時,超過了64KB,那麼可以定義多個代碼段或數據段、堆棧段、附加段。

Ⅶ 3、 8086CPU內的4個16位的段寄存器存放的是什麼地址怎樣才能定址1MB的存儲空間

給你詳細的資料
1、 8086CPU和8088CPU內部結構基本相同,不同之處在於8088有8條外部數據匯流排,因此為准16位。8086有16條外部數據匯流排。兩個CPU的軟體完全兼容,程序的編制也完全相同。

2、 8086CPU從功能上分為兩大部分:一是執行部件(EU),二是匯流排介面部件(BIU)。

執行部件是由以下雖部分組成:

(1)四個通用寄存器:AX BX CX DX

(2)四個專用寄存器:基數指針寄存器BP,堆棧指針寄存器SP,源變址寄存器SI,目的變址寄存器DI

(3)標志寄存器FR

(4)算術邏輯部件ALU

功能是負責執行所有的指令,向匯流排介面部件提供指令執行的結果數據和地址,並對通用寄存器和標志寄存器進行管理。

匯流排介面部件由以下部件組成:

(1)四個段寄存器:代碼段寄存器,數據段寄存器,附加段寄存器,堆棧段寄存器。

(2)指令指針寄存器

(3)地址加法器

(4)指令隊列

功能:執行外部匯流排周期,負責存儲器與外部埠I|O傳送數據。也就是負責CPU與存儲器和外設之間的信息交換。

3、共有14個寄存器,分成3個部分:

(!)通用寄存器8個 :AX, BX , CX, DX , SP , BP ,SI ,DI.

AX , BX ,CX , DX為數據寄存器,用來保存運算中的中間結果和有效地址。4個寄存器既可以做16位寄存器,也可以做8位寄存器 AL, AH, BL, BH, CL, CH, DL, DH.。

在程序設計中,一般把AX用作累加器。BX 用作基址寄存器,CX用作計數器,DX用作數據寄存器。

SP:堆棧指針寄存器;裝棧頂指針偏移量。

BP:基址指針寄存器:裝棧段中一個數據區的基址偏移量。

SI:源變址寄存器;裝源操作數地址的偏移量。

DI:目的變址寄存器;裝目的操作數地址偏移量。

(2)段寄存器4個

CS;代碼段寄存器;裝代碼段的起始地址;

DS;數據段寄存器;裝數據段的起始地址;

SS; 堆棧段寄存器;裝堆棧段的起始地址;

ES: 附加段寄存器;裝附加段的起始地址。

(3)控制寄存器兩個:IP,FR。

IP:指令指針寄存器;始終存放當前指令的下一第指令的起始存儲單元的偏移地址。

FR:狀態標志寄存器;用來存放運算結果和特徵。16位寄存器,用39位。

標志位分為兩大類:一類是狀態標志,用來表示算術、邏輯運算的結果特徵。(CF,PF,AF,ZF,SF,OF)。一類是控制標志;用來表示控制CPU的操作特徵。(IF、DF、TF)

CF(FR0):CF=1為加、減運算結果的最高位有進位或有借位,否則CF=0。

PF(FR2):PF=1為操作結果「1」的個數為偶數,否則PF=0。

AF(FR4):AF=1為運算結果的低4位向高4位有進位或有借位,(用於10進制BCD碼運算指令)否則A=0。

ZF(FR6):ZF=1運算結果為0,否則ZF=0。

SF(FR7):SF=1運算結果最高為0(E),否則SF=0。

OF(FR11):OF=1在算術運算時,帶符號數的運算結果超出數的表示範圍。否則OF=0。

TF(FR8):TF=1CPU進入單步工作方式。

IF(FR9):IF=1允許CPU響應可屏蔽外部中斷請求。IF=0禁止中斷。

DF(FR10):DF=1在字元串操作時使地址指針自動減量。DF=0自動增量。

4、 8086系統的物理地址是將段地址寄存器的內容左移4位(或乘16)加上偏移地址,即可得到20位的物理地址。

2000H左移4位為20000H,加上2100H為22100H,則物理地址為22100H。

5、8086/8088CPU把BIU完成一次訪問存儲器或外設操作所需的時間稱為一個匯流排周期。一個匯流排周期最少包含4個時鍾周期(T1~T4)。當訪問存儲器(讀、寫)或外設時,存儲器或外設不能及時地配合CPU傳送數據,存儲器或外設通過「READY:信號在T3之前向CPU發一個「數據未准備好」信號,CPU在T3之後插入一個或多個等待時鍾周期TW。當存儲器外設准備好數據,通過「READY」發「准備好」信號,CPU接收到這個信號後,會自動脫離TW狀態進入T4狀態。因此插入多少個TW取決於「READY」信號。

1、 最小模式:就是在系統中只有8086/8088一個微處理器。在該系統中,所有的匯流排控制信號都直接由8086/8088產生,因此,系統中匯流排控制電路被減到最少。

最大模式:在系統中包含兩個或多個微處理器,其中一個主處理器就是不是8088/8086,其它處理器為協處理器,是協助主處理器工作的。它用在中等規模或大型的8088/8086系統中。一般情況下和8088/8086配合的協處理器有兩個,一個是數值運算協處理器8087,一個是輸入/輸出協處理器8089。將8088/8086CPU的第33腳接地時,系統處於最大模式,當第33腳接+5V時,系統為最小模式。

2、 地址鎖存器就是一個暫存器,它根據控制信號的狀態,將匯流排上的地址代碼暫存起來。8088/8086的數據和地址匯流排採用分時復用不著操作方式,即用同一匯流排既傳送地址又傳送數據。當微處理器與存儲器交換信號時,首先由CPU發送存儲器的地址,同時發允許鎖存信號ALE給鎖存器,當鎖存器接到該信號後將地址/數據匯流排上的地址鎖存在鎖存器中,隨後才能傳送數據。

3、 8086中的典型時序包括:

(1)存儲器讀與寫周期。

(2)I/O設備的讀與寫周期。

(3)中斷響應周期。

(4)系統復位。

(5)空轉周期。

(6)CPU進入和退出保持狀態的時序。

?? 8086CPU的位元組定址范圍有多大?為什麼?存儲器為什麼分段?20位物理地址的形成過程是怎樣的?

答:8086CPU定址范圍1MB。因為8086CPU地址線為20條,2^20=1024KB,即1MB。8086系統中,指令僅給出16位地址,與定址有關的寄存器也只有16位長,因此定址范圍只有64KB,為了定址1MB,所以分成四個邏輯段。當CPU訪問內存時,段寄存器的內容(段基址)自動左移4位(二進制),與段內16位地址偏移量相加,形成20位的物理地址。

採用分段結構的存儲器中,任何一個邏輯地址都由段基址和偏移地址兩部分構成,都是 16位二進制數。
物理地址:存儲器的絕對地址,從00000H~FFFFFH,是CPU訪問存儲器的實際定址地址(也稱為絕對地址)
16位的段基址左移4位(相當於在段基址最低位後添4個「0」),然後與偏移地址相加獲得物理地址,這相當於完成如下的地址運算:
物理地址=段基址×16+偏移地址


採用分段結構的存儲器中,任何一個邏輯地址都由段基址和偏移地址兩部分構成,都是 16位二進制數。
物理地址:存儲器的絕對地址,從00000H~FFFFFH,是CPU訪問存儲器的實際定址地址(也稱為絕對地址)
16位的段基址左移4位(相當於在段基址最低位後添4個「0」),然後與偏移地址相加獲得物理地址,這相當於完成如下的地址運算:
物理地址=段基址×16+偏移地址

Ⅷ 匯編語言中字元串變數是如何存儲的啊

DOS中斷21號
功能0AH

功能描述: 從標准輸入設備上讀入一個位元組字元串,遇到「回車鍵」結束輸入(輸入的字元在標準的輸出設備上有回顯)。如果該輸入操作被重定向,那麼,將無法判斷文件是否已到文件尾
入口參數: AH=0AH
DS:DX=存放輸入字元的起始地址
接受輸入字元串緩沖區的定義說明:
1、第一個位元組為緩沖區的最大容量,可認為是入口參數;
2、第二個位元組為實際輸入的字元數(不包括回車鍵),可看作出口參數;
3、從第三個位元組開始存放實際輸入的字元串;
4、字元串以回車鍵結束,回車符是接受的最後一個字元;
5、若輸入的字元數超過緩沖區的最大容量,則多出的部分被丟棄,系統並發出響鈴,直到輸入「回車」鍵才結束輸入。
例如:
BUFF 80, ?, 80 DUP(?) ;最多接受80個字元

出口參數: 無
例子:
BUFF 80, ?, 80 DUP(?)
.
.
.
lea dx,buff
mov ah,0ah
int 21h
輸入內容是12345678
那麼指令執行結果buff的內存數據為:
50h 08h 31h 32h 33h 34h 35h 36h 37h 38h 0dh
你輸入的字元串是31h到38h,0dh是結束標志。

使用串傳送指令:
CX存放字元串的長度,DS:SI存放源字元串的地址,ES:DI存放目的字元串的地址,cld設置向高地址單元位移。
執行rep movsb

Ⅸ 8086為什麼高位先存

這沒有為什麼!這是一種習慣出來的規則,你說的這就是INTEL規則,因它的晶元出來時方便這種高位在後,低位在前的用,這慢慢的就成了一種習慣,當然再在後的發展中因低層(匯編)全這用的它,所以高級平台慢慢也用它了這就成了INTEL系列的規則了,而MOTOROLA的晶元在使用中,哈!可就不是了,它可就高位在前,低位在後才好用的,哈!也可能就是樓上說的大端位元組吧。
不只在這數的順序上,在文件的規定中也是一樣的,就如HEX文件這也是一種INTEL格式的文件。當然,這也可能和當初的市場竟爭有原因,在剛出來的初期,都想把自己的規則變成通用標准而才好佔領,打開自己的產品市場的嘛。

Ⅹ 匯編語言8086的一個問題,程序如下,為什麼我執行程序後str1是從ds 0200h開始存儲的

//注意下面的代碼:
/*inc di後dl的值也+1了,dl是di的低8位,這個循環在你的程序中,一直到循環256次後 di=100000000b ,dl才會溢出再為0,此時di指向的位置是str1的偏移0x100+256(0x100)也就是0x200*/
circle1:
inc di
cmp dl,[ds:di] //此處你本意應是與0比較,現在比較的已經不是0了
jnz circle1

//具體我沒有測試,你試著把這里的dl用寄存器al,bl之類代替,還有問題的話,你留言

熱點內容
安卓手機商務型哪個牌子好 發布:2024-11-19 13:43:04 瀏覽:583
雲主機哪個配置好 發布:2024-11-19 13:34:43 瀏覽:967
c語言數字u 發布:2024-11-19 13:34:02 瀏覽:960
九游游戲安卓手機下載慢怎麼回事 發布:2024-11-19 13:29:03 瀏覽:431
無線存儲共享器怎麼樣 發布:2024-11-19 13:29:02 瀏覽:110
外網伺服器搭建vpn 發布:2024-11-19 13:20:39 瀏覽:370
淘寶分銷一鍵上傳 發布:2024-11-19 13:18:01 瀏覽:179
ftpgetfilesize 發布:2024-11-19 13:12:59 瀏覽:959
14位數密碼有多少種可能 發布:2024-11-19 12:48:11 瀏覽:110
刪除引索的sql語句 發布:2024-11-19 12:39:13 瀏覽:64