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 (開始寫程式。)