天天看點

第六章包含多個段的程式6.1

1.程式源碼如下,主要是為了得出

assume cs:codesg

codesg segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cabh,0987h

mov bx,0

mov ax,0

mov cx,8

s:add ax,cs:[bx]

add bx,2

loop s

mov ax,4c00h

int 21h

codesg ends

end

用debug target.exe進行調試,但是我們并不是真的運作此程式。而是為了檢視其相關資料資訊。

-r

AX=0000 BX=0000 CX=0026 DX=0000 SP=0000 BP=0000 SI=0000 DI=0000

DS=143C ES=143C SS=144C CS=144C IP=0000 NV UP EI PL NZ NA PO NC

144C:0000 2301 AND AX,[BX+DI] DS:0000=20CD

從這裡可以知道ds=143c,則ds:0000是psp開始的段位址,那存放程式的位址就是:ds+10:0h=143c+10h=144ch

我們可以用指令d 144c:0000來檢視其内容,如下:

-d 144c:0000

144C:0000 23 01 56 04 89 07 BC 0A-EF 0D ED 0F AB 0C 87 09 #.V.............

144C:0010 BB 00 00 B8 00 00 B9 08-00 2E 03 07 83 C3 02 E2 ................

144C:0020 F8 B8 00 4C CD 21 00 00-00 00 00 00 00 00 00 00 ...L.!..........

144C:0030 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

144C:0040 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

144C:0050 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

144C:0060 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

144C:0070 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

-

我們可以看到,程式中的立即數存放在程式的最開始處。并且用了16個位元組。是以程式的正規指令是從144c:10處開始的,我們可以用

u 144c:10來檢視是否推測正确。

-u 144c:10

144C:0010 BB0000 MOV BX,0000

144C:0013 B80000 MOV AX,0000

144C:0016 B90800 MOV CX,0008

144C:0019 2E CS:

144C:001A 0307 ADD AX,[BX]

144C:001C 83C302 ADD BX,+02

144C:001F E2F8 LOOP 0019

144C:0021 B8004C MOV AX,4C00

144C:0024 CD21 INT 21

144C:0026 0000 ADD [BX+SI],AL

總結:我們可以看到程式加載到記憶體中後,所占記憶體空間的前16個單元存放着源程式中用dw定義的資料,後面的單元存放源程式中彙編指令所對應的機器指令。那如何執行程式中的指令呢?其ip開始值為0,我們隻能通過修改ip值為10h,進而使cs:ip指向程式中的第一條指令,而後用t指令等執行。可是在這樣的話,就必須用debug來執行程式。如果編譯成可執行的檔案後,在系統之中直接運作可能會出現問題,因為程式的入口不是我們所希望執行的指令。

解決方案:運用Start 和end start來進行解決。我們要讓cpu從何處開始執行程式,我們隻需要在結尾處這樣寫end 标号。修改後是這樣:

assume cs:codesg

codesg segment

dw 0123h,0456h,0789h,0abch,0defh,0fedh,0cabh,0987h

start: mov bx,0

mov ax,0

mov cx,8

s:add ax,cs:[bx]

add bx,2

loop s

mov ax,4c00h

int 21h

codesg ends

end start