匯編基本知識_第1頁
匯編基本知識_第2頁
匯編基本知識_第3頁
匯編基本知識_第4頁
匯編基本知識_第5頁
已閱讀5頁,還剩3頁未讀 繼續免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、為什么assume了DS以后,在代碼里面還要再次mov ax,data;mov ds,ax呢?這里的 assume 語句是告訴編譯器各個段是由哪個段寄存器指向的,這樣編譯器就可以根據所設定的條件在需要時加上段前綴指令;它并不生成對段寄存器進行設置的指令,這個是需要程序自己來做的。所以,就有了 assume 語句之后,代碼里自己設置相應的段寄存器。嗯 樓上說的對。匯編語言有三類指令:(1)匯編指令,如mov ax,0等,有對應的機器碼;(2)偽指令,如assume,db等,由編譯器執行,計算機并不執行,沒有對應機器碼;(3)其他符號,如+、-等,由編譯器識別,沒有對應機器碼。所以,assume只

2、是給編譯器一個信息,告訴編譯器相關段寄存器和段的聯系。但是,計算機并不執行它,要想真正將段地址存放到相關段寄存器中,需要用匯編指令來完成。匯編語言中data segment什么意思下面是匯編的基本框架:定義數據段 就是數據存放的地方DATA SEGMENT.DATA ENDS定義代碼段 當然就是要執行的程序代碼了CODE SEGMENTSTART:.CODE ENDSEND START匯編偽指令assume cs:code,ds:data,ss:stack的含義王爽的匯編教程中,下面一段匯編源文件,大意是把0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0c

3、bah, 0987h這8個數,通過入棧出棧的方法逆序排列回原來的內存位置。assume cs:code, ds:data, ss:stackdata segmentdw 0123h, 0456h, 0789h, 0abch, 0defh, 0fedh, 0cbah, 0987hdata endsstack segmentdw 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0stack endscode segmentstart: mov ax,stackmov ss,axmov sp,20hmov ax,datamov ds,axmov bx,0mov cx,8s: push b

4、xadd bx,2loop smov bx,0mov cx,8s0: pop bxadd bx,2loop s0mov ax,4coohint 21hcode endsend start那么問題來了。問題:開頭的偽指令assume cs:code,ds:data,ss:stack作用既然不是把cs、ds、ss三個指針指向三個段,那寫它有什么用?問題:ds,ss指針都通過mov ax,data mov ds,ax和mov ax,stack mov ss,ax被手動指向的正確的代碼段。唯獨cs指針沒有標明指向,程序是如何把cs指針指向正確的代碼段的。最佳答案問題:你的程序中,可以用十個八個段,比如

5、段名 D1,D2,D3,D4,D5,D6,8086/8088 CPU的設計,是任一時刻,只能通過4個段寄存器最多同時訪問4個段。那么問題來了:某個段(比如D5段)與哪個段寄存器關聯、用哪個段寄存器訪問呢?assume偽指令就是用來解決這個問題的。你 assume ES:D5 以后,就將程序中的D5段與ES段寄存器綁定了,匯編程序能知道,訪問D5段中的變量,要用ES作為段寄存器。問題:DOS操作系統的程序裝入功能,是這樣設計的:裝入exe文件時,根據exe文件頭中的信息,將CS:IP指向裝入后內存中程序的入口(第一條執行指令),也就是說,要在裝入程序時設置CS, IP兩個寄存器。對于其它3個段寄

6、存器,DOS裝入功能的處理,是將它們指向DOS操作系統為管理程序內存而創建的程序段前綴PSP的段地址。那么問題來了:程序運行后,要訪問程序中的某個段里的數據,怎么辦呢?答案當然就是需要你自己在程序中加入將段地址傳送到段寄存器的指令啦。最后提一下,assume是給匯編程序在匯編翻譯源程序時用的,段寄存器(CS除外)要自己設置初值是DOS操作系統的功能要求你程序這么做的。追問assume ES:D5 以后,就將程序中的D5段與ES段寄存器綁定了這個“綁定”的意思是:如果用其他段寄存器比如DS:bx訪問D5段,程序就會報錯嗎?追答舉個例子吧:假設,在D5段中有一個變量x02,你程序中某處有一條指令

7、mov ax, x02若沒有assume,匯編這條mov指令時,匯編程序會報錯。因為不知道用哪個段寄存器。有assume,匯編結果是 mov ax, es:(x02的偏移地址),因為你assume告訴了匯編程序這個段用的是es這個段寄存器MOV AX,DATAS MOV DS,AX 這兩句是什么意思?mov ax, datas ;將偽段地址放入ax中,datas不是指令,而是偽指令,實際上是一個動態的內存地址,要想運行,必須先其地相放入到ds中,但是內存數不能放入段地址。所以mov ds,ax ;就是將段地址裝入段寄存器,最終達到了段地址裝入段寄存器的目的!在80X86中規定,內存數不可以直接

8、裝入段寄存器,所以才會有這樣的一次中轉!datas不是指令字,而是偽指令,實際上你可以理解他為一個標簽,將這個標簽裝入AX中,實際裝入的就是數據段的首地址!指令與偽指令的區別在在于,指令是屬性指令集(屬于CPU的),而偽指令則是屬于編譯軟件的,掃描后由編譯軟件進行的操作。DOS系統功能調用表(INT 21H) AH功能調用參數返回參數00程序終止(同INT 20H)CS=程序段前綴01鍵盤輸入并回顯AL=輸入字符02顯示輸出DL=輸出字符03異步通迅輸入AL=輸入數據04異步通迅輸出DL=輸出數據05打印機輸出DL=輸出字符06直接控制臺I/ODL=FF(輸入)DL=字符(輸出)AL=輸入字符

9、07鍵盤輸入(無回顯)AL=輸入字符08鍵盤輸入(無回顯)檢測Ctrl-BreakAL=輸入字符09顯示字符串DS:DX=串地址$結束字符串0A鍵盤輸入到緩沖區DS:DX=緩沖區首地址(DS:DX)=緩沖區最大字符數(DS:DX+1)=實際輸入的字符數0B檢驗鍵盤狀態AL=00有輸入AL=FF無輸入0C清除輸入緩沖區并請求指定的輸入功能AL=輸入功能號(1,6,7,8,A)0D磁盤復位清除文件緩沖區0E指定當前缺省的磁盤驅動器DL=驅動器號0=A,1=B,.AL=驅動器數0F打開文件DS:DX=FCB首地址AL=00文件找到AL=FF文件未找到10關閉文件DS:DX=FCB首地址AL=00目錄

10、修改成功AL=FF目錄中未找到文件11查找第一個目錄項DS:DX=FCB首地址AL=00找到AL=FF未找到12查找下一個目錄項DS:DX=FCB首地址(文件中帶有*或?)AL=00找到AL=FF未找到13刪除文件DS:DX=FCB首地址AL=00刪除成功AL=FF未找到14順序讀DS:DX=FCB首地址AL=00讀成功 =01文件結束,記錄中無數據 =02 DTA空間不夠 =03文件結束,記錄不完整15順序寫DS:DX=FCB首地址AL=00寫成功 =01盤滿 =02 DTA空間不夠16建文件DS:DX=FCB首地址AL=00建立成功 =FF無磁盤空間17文件改名DS:DX=FCB首地址(D

11、S:DX+1)=舊文件名(DS:DX+17)=新文件名AL=00成功AL=FF未成功19取當前缺省磁盤驅動器AL=缺省的驅動器號0=A,1=B,2=C,.1A置DTA地址DS:DX=DTA地址1B取缺省驅動器FAT信息AL=每簇的扇區數DS:BX=FAT標識字節CX=物理扇區大小DX=缺省驅動器的簇數1C取任一驅動器FAT信息DL=驅動器號同上21隨機讀DS:DX=FCB首地址AL=00讀成功 =01文件結束 =02緩沖區溢出 =03緩沖區不滿22隨機寫DS:DX=FCB首地址AL=00寫成功 =01盤滿 =02緩沖區溢出23測定文件大小DS:DX=FCB首地址AL=00成功(文件長度填入FC

12、B)AL=FF未找到24設置隨機記錄號DS:DX=FCB首地址25設置中斷向量DS:DX=中斷向量AL=中斷類型號26建立程序段前綴DX=新的程序段前綴27隨機分塊讀DS:DX=FCB首地址CX=記錄數AL=00讀成功 =01文件結束 =02緩沖區太小,傳輸結束 =03緩沖區不滿28隨機分塊寫DS:DX=FCB首地址CX=記錄數AL=00寫成功 =01盤滿 =02緩沖區溢出29分析文件名ES:DI=FCB首地址DS:SI=ASCIIZ串AL=控制分析標志AL=00標準文件 =01多義文件 =02非法盤符2A取日期CX=年DH:DL=月:日(二進制)2B設置日期CX:DH:DL=年:月:日AL=

13、00成功 =FF無效2C取時間CH:CL=時:分DH:DL=秒:1/100秒2D設置時間CH:CL=時:分DH:DL=秒:1/100秒AL=00成功 =FF無效2E置磁盤自動讀寫標志AL=00關閉標志AL=01打開標志2F取磁盤緩沖區的首址ES:BX=緩沖區首址30取DOS版本號AH=發行號,AL=版本31結束并駐留AL=返回碼DX=駐留區大小33Ctrl-Break檢測AL=00取狀態 =01置狀態(DL)DL=00關閉檢測 =01打開檢測DL=00關閉Ctrl-Break檢測 =01打開Ctrl-Break檢測35取中斷向量AL=中斷類型ES:BX=中斷向量36取空閑磁盤空間DL=驅動器號

14、0=缺省,1=A,2=B,.成功:AX=每簇扇區數 BX=有效簇數 CX=每扇區字節數 DX=總簇數失敗:AX=FFFF38置/取國家信息DS:DX=信息區首地址BX=國家碼(國際電話前綴碼)AX=錯誤碼39建立子目錄(MKDIR)DS:DX=ASCIIZ串地址AX=錯誤碼3A刪除子目錄(RMDIR)DS:DX=ASCIIZ串地址AX=錯誤碼3B改變當前目錄(CHDIR)DS:DX=ASCIIZ串地址AX=錯誤碼3C建立文件DS:DX=ASCIIZ串地址CX=文件屬性成功:AX=文件代號錯誤:AX=錯誤碼3D打開文件DS:DX=ASCIIZ串地址AL=0讀 =1寫 =3讀/寫成功:AX=文件代

15、號錯誤:AX=錯誤碼3E關閉文件BX=文件代號失敗:AX=錯誤碼3F讀文件或設備DS:DX=數據緩沖區地址BX=文件代號CX=讀取的字節數讀成功: AX=實際讀入的字節數 AX=0已到文件尾讀出錯:AX=錯誤碼40寫文件或設備DS:DX=數據緩沖區地址BX=文件代號CX=寫入的字節數寫成功: AX=實際寫入的字節數寫出錯:AX=錯誤碼41刪除文件DS:DX=ASCIIZ串地址成功:AX=00出錯:AX=錯誤碼(2,5)42移動文件指針BX=文件代號CX:DX=位移量AL=移動方式(0:從文件頭絕對位移,1:從當前位置相對移動,2:從文件尾絕對位移)成功:DX:AX=新文件指針位置出錯:AX=錯

16、誤碼43置/取文件屬性DS:DX=ASCIIZ串地址AL=0取文件屬性AL=1置文件屬性CX=文件屬性成功:CX=文件屬性失敗:CX=錯誤碼44設備文件I/O控制BX=文件代號AL=0取狀態 =1置狀態DX =2讀數據 =3寫數據 =6取輸入狀態 =7取輸出狀態DX=設備信息45復制文件代號BX=文件代號1成功:AX=文件代號2失敗:AX=錯誤碼46人工復制文件代號BX=文件代號1CX=文件代號2失敗:AX=錯誤碼47取當前目錄路徑名DL=驅動器號DS:SI=ASCIIZ串地址(DS:SI)=ASCIIZ串失敗:AX=出錯碼48分配內存空間BX=申請內存容量成功:AX=分配內存首地失敗:BX=

17、最大可用內存49釋放內容空間ES=內存起始段地址失敗:AX=錯誤碼4A調整已分配的存儲塊ES=原內存起始地址BX=再申請的容量失敗:BX=最大可用空間 AX=錯誤碼4B裝配/執行程序DS:DX=ASCIIZ串地址ES:BX=參數區首地址AL=0裝入執行AL=3裝入不執行失敗:AX=錯誤碼4C帶返回碼結束AL=返回碼4D取返回代碼AX=返回代碼4E查找第一個匹配文件DS:DX=ASCIIZ串地址CX=屬性AX=出錯代碼(02,18)4F查找下一個匹配文件DS:DX=ASCIIZ串地址(文件名中帶有?或*)AX=出錯代碼(18)54取盤自動讀寫標志AL=當前標志值56文件改名DS:DX=ASCII

18、Z串(舊)ES:DI=ASCIIZ串(新)AX=出錯碼(03,05,17)57置/取文件日期和時間BX=文件代號AL=0讀取AL=1設置(DX:CX)DX:CX=日期和時間失敗:AX=錯誤碼58取/置分配策略碼AL=0取碼AL=1置碼(BX)成功:AX=策略碼失敗:AX=錯誤碼59取擴充錯誤碼AX=擴充錯誤碼BH=錯誤類型BL=建議的操作CH=錯誤場所5A建立臨時文件CX=文件屬性DS:DX=ASCIIZ串地址成功:AX=文件代號失敗:AX=錯誤碼5B建立新文件CX=文件屬性DS:DX=ASCIIZ串地址成功:AX=文件代號失敗:AX=錯誤碼5C控制文件存取AL=00封鎖 =01開啟BX=文件代號CX:DX=文件位移SI:DI=文件長度失敗:AX=錯誤碼62取程序段前綴BX=PSP地址匯編中INT 21H是什么意思?INT 軟件中斷, 21H是函數入口地址,實際上就是調用DOS的系統功能。是DOS的中斷調用比如MOV AH 4CHINT 21H是返回DOS系統的通過給AH寄存器賦值4CH,然后調用INT 21H指令,計算機就會根據AH寄存器中的值執行相應的操作,其中4CH是返回D

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論