精華區beta GJ7thP3thing 關於我們 聯絡資訊
8086的ADDRESS (定址規則) 以32BIT來表示(16進位8位數,分為兩段) 分為SEGMENT 16BIT(16進位4位數) 和OFFSET 16BIT(16進位4位數) 實體ADDRESS以20BIT來表示(16進位五位數) Z80 6502 ADDRESS以16BIT表示,(16進位四位數) 總共可以定址64K BYTE。 每一個BYTE都會使用一個ADDRESS,每個BYTE內容為8BIT。 例:某種CPU ADDRESS BAR含有4條線,即:ADDRESS占4BIT。 像此種電腦的RAM 可裝多大? 答:4BIT共可組出2^4 個不同的ADDRESS,所以共可以裝16BYTE的RAM。 (地址是由電路來決定的) (地址長短和存放的資料量大小無關,就像是家裡的地址長短和家裡大不大沒有關係。ꄊ^ LOGICAL 邏輯記憶體法 SEGMENT:OFFSET 如 F175:1111 就等於.. PHYSICAL 實體記憶體法 將 F175 + 1111 ....................就是邏輯記憶體位址了。 -------- F2861 .....................就是實體記憶體位址了。 PARAGRAPH 就是 ****:000*(*表示固定數字) ^^^^ ^.....一共可以填16個所以共有16BYTE稱為一個PARAGRAPH。 SEGMENT 另一個角度來講,每16BYTE形成一個PARAGRAPH。SEGMENT的值可視為PARAGRAPHꨊ먊地址。 當電腦想要使用空的記憶體空間時候,作業系統就會最後的PARAGRAPH的邊界。 然後命名下一個BYTE為XXXX:0000,這樣程式就會有64K得空間可以使用。 這是程式剛剛好只有64K大小的時候。 (為什麼從就後一個的PARAGRAPH改使找下一個可以使用的SEGMEN呢?) 0000:0000 到 FFFF:FFFF為HIGH MEMORY。 DEBUG 指令用法 -------------------------------- -Q 離開 -D [記憶體位址] DUMP 傾印的意思 例:如打入 D 110就會印出 XXXX:0110後面的記憶體內容。 DOS 指令 -------------------------------- TYPE [檔名] 將檔案內容以文字檔的方式列出。 DEBUG [檔名] 將檔案LOAD(載入)記憶體中。可以使用D指令來看裡面的內容。 ASCII 稱號 在C++中 ------------------------- OD CR \r carrage return OA LF \n linefeed 在MSDOS中 CR + LF代表換行。 在UNIX中LF就代表換行。 檔案結構有BINDERY和ASCII兩種,差別就在換行控制碼不同,一個是LF,一個是CR+LF。 -- 哈哈哈~~~不小心讓我看到的~~~PO上來給大家看吧! -- ※ 發信站: 批踢踢(ptt.csie.ntu.edu.tw) ◆ From: swtp130-4.adsl.seed.net.tw > -------------------------------------------------------------------------- < 作者: rocky71922 (耶~~有新電腦了~~) 看板: GJ7thP3thing 標題: 還有粉多~ 時間: Thu Apr 5 01:43:35 2001 DEBUG 指令用法 -------------------------------- D [range(範圍)] DUMP<-傾印記憶體 RANGE的寫法 1.「開始地址」 「結束地址」 2.「開始地址」 L (BYTE 數) 3.「開始地址」(預設為 L 80) 4.預設為下個BYTE及L80 E 「開始地址」 (LIST OF BYTE) 修改記憶體內的內容。 E 「開始地址」 每一次一個BYTE逐步填入,SPACE向前,-倒退,CR(ENTER)結束。 W WRITE的意思,存檔,就是將改變後的值給存入檔案。 寫入檔案的大小受BX和CX暫存器的影響。 檔案長度就=BX*2^16+CX 「當要修改檔案的時候電腦會將長度放入BX和CX的暫存器中。」 Ex.譬如:我要將寫入的檔案大小更改,我就去改CX中的值。 假設原本的CX是0016為16BYTE,那我改成0020的話就變成存入記憶體 R REGISTER 暫存器的意思 就會SHOW出每一個暫存器的狀況。一共有8個通用的REGISTER, 另外有4個控制SEGMENT的暫存器。 還有一個叫IP的暫存器,最後幾個英文字就是所謂的FLAG。 一般暫存器表示法為 AX xxxx xxxx xxxx xxxx (一共16個BIT=2 BYTE) ^^^^^^^^^ ^^^^^^^^^ 稱為AH 稱為AL BX CX DX -----以上四個可以分為HIGH和LOW,其他暫存器則不行。 SI DI SP BP --------以上8個為一般的暫存器 F IP --------以上兩個是程式流程控制REGISTER CS DS ES SS --------以上四個是SEGMENT REGISTER。 R 「哪一個REGISTER」修改REGISTER的值。 原則上SEGMENT REGISTER通常不會更改(因為初學) N 指定檔案名稱 EX. N A2.Txt (Enter) 下了指令後,檔名已經改變,但不會顯現出來。 (總而言之:用N指定FILENAME,用BX、CX指定FILE LENGTH,才用W指令寫入。) 如何在DEBUG中開啟一個舊檔 -N 檔案名稱, 例如 N A2.TXT -L (LOAD檔案就是讀出你剛剛設定的檔案名稱。) 這個動作就等於 DEBUG A2.TXT Floppy 軟碟。 ------------------------------ 內部結構經過FORMAT後會變成好幾個TRACK(軌道)和SECTOR(磁區) 所以電腦存檔的時候會存在哪一個TRACK中的SECTOR。 所以磁碟無法一次讀一個BYTE,所以一次就讀一個SECTOR, 那每一個SECTOR的大小都不一致,有可能512K或256K等等。 所以在MAIN MEMORY中最小的定址單位為BYTE, 在磁片中,最小的定址單位為一個SECTOR。 FILE (檔案的觀念) ------------------------------ FILE在以前大家會弄錯的一個觀念就是認為FILE是一行一行的。 但事實上,FILE是一長條的檔案,在存檔的動作發生的時候, 電腦會到FAT(FILE ALLOCATION TABLE檔案定位表格)中去儲存。 FAT會表示出有哪些空下來的SECTOR,電腦就將檔案切成好幾份 然後分批放入不同的TRACK、SECTOR中。 當電腦想要讀取檔案的時候就要到FAT表去找這個FILE的第一個SECTOR 在哪裡,第二個在哪,等等一個一個讀進來。最後組成檔案放入記憶體。 Qucik Format 快速格式化 ------------------------------- 將磁片中的FAT表洗掉。所有資料就不見。 老師習題: &&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&& 1.進入DEBUG 2.從100開始寫入大A到大Z、小A到小Z、從0到9共三行。 3.檔案長度就等於十進位 26 + 26 + 10 + 6<-換行三次 = 68 4.將68由十進位換成16進位 = 44 5.設定CX暫存器為44 6.用W指令寫入檔案。 > -------------------------------------------------------------------------- < 作者: rocky71922 (耶~~有新電腦了~~) 看板: GJ7thP3thing 標題: 還想看嗎?~ 時間: Thu Apr 5 01:45:44 2001 DEBUG指令 --------------------------------- -H 數1 數2 (16進位加減指令) 忽視進位、借位,只處理四位數。 Ex.-H 3 7 傳回 000A FFFC(第一個數是數1+數2,第二個數是數1-數2) Ex.-H 0 213E 傳回第一個數為:213E 傳回第二個數為:DEC2 第二個數的算法為: 10000 -213E -------- DEC2 -F [RANGE範圍] [LIST] RANGE範圍的寫法可以如下: 1.-F「開始位址」 「結束位址」 Ex. -F 100 17F 42 就是從100到17F的範圍內全部填入42的值。 2.-F 「開始地址」 L [BYTE數] Ex. -F 100 L10 42 就是從100開始往後的10個BYTE填入42的值。 Ex. -F 150 L20 31 32 33 34 就是從150的位址開始往後的20個BYTE填入31 32 33 34。 所以就會變成: 136C:0100 31 32 33 34 31 32 33 34-31 32 33 34 31 32 33 34 1234123412341234 136C:0110 31 32 33 34 31 32 33 34-31 32 33 34 31 32 33 34 1234123412341234 Ex. -F 150 L20 "1234" 所出來的效果就和上一個例子是一樣的。 "1234"可以用在E的指令中,所以「E 100 41」=「E 100 "A"」 -M [RANGE範圍] [目的地開始地址] 搬移某一範圍的資料到另一塊地址(目的地地址) (嚴格的說,這個指令只能算是抄寫的意思,也就是COPY。) Ex. -M 0100 0103 0300 (前兩個參數為RANGE,後面的那個是目的地) 將原來0100到0103的資料抄寫到0300到0303之間。 Ex. -M 0100 L3 0300 效果和前面的例子是一樣的。 -S [RANGE範圍] [LIST] 搜尋 Ex. -S 0700 L20 41 42 從0700往後的20個BYTE搜尋看有沒有符合41 42的資料。 如果找到了電腦會列出找到的位址。 (可以用在搜尋病毒碼上面,因為病毒都有特定BYTE。) -C [RANGE範圍] [destination目的地位址] 比對兩個記憶體範圍的資料是否相符合。 Ex. -C 400 40f 500 (比對從400到40F是不是和500到50F的資料是一樣的。) 機器語言程式寫作 ---------------------------------- 機器碼 給CPU執行。 代碼 給人看的。 我們如果從代碼換成機器碼就為 A(ASSEMBLE組合或稱組譯)指令。 我們如果從機器碼換成代碼就為 U(UNASSEMBLE反組譯)指令。 6502 CPU因為很簡單,所以機器碼和代碼之間的寫作通常是一對一。 一道機器碼 = 一道代碼。 80X86 CPU因為複雜 一道機器碼 可能為 多道代碼, 一道代碼也可能為多道機器碼。 指令 ------------- MS DEBUG的指令 如 -M、-S、-F等等。 指揮CPU的指令。 80X86CPU指令 ------------- 代碼 MOV [目的地],[來源] REGISTER -> REGISTER called reansfer REGISTER -> MEMORY called write MEMORY -> REGISTER called read MEMORY 和 REGISTER 中的資料統稱 VALUE Ex. MOV AX,1234 (將1234的值抄到AX暫存器中。) MOV CX,AX MOV [200],CX MOV AX,[200] INT 3 <-程式結束,在DEBUG中適用而已。 (這幾個命令都是16BIT的資料移動) -G = [開始地址] (從特定位址開始執行程式) = 一定要寫 Ex. -G = 100 告訴電腦從位址100的地方開始跑程式。 ^^^^^指定IP的位址。 //關於HIGH與LOW --------------------- 在AX暫存器中分為AH及AL兩個,每個8BIT共16BIT。 如果今天下了一道指令 MOV AX,1234, 則暫存器中的值就為 1234,那將AX分為兩份,一份AH,一份AL 這樣的話AH=12,AL=34,但是當MOV [200],CX的時候又不一樣了。 因為有兩個BYTE,所以電腦會將200當成AL,201當成AH。 -A (開始寫程式。)