CS344-321 Assembly Language Programming

Download Report

Transcript CS344-321 Assembly Language Programming

CS344-321 Assembly Language Programming
Period 10
ตัวอย่าง การเขียนโปรแกรมแบบแฟ้ม .EXE
display
equ
9h
;display output function
doscall
equ
21h
;DOS interrupt number
data_seg segment
hello_message db 'Hello, world!', 0dh, 0ah, '$'
data_seg ends
code_seg
segment
assume cs:code_seg, ds:data_seg
start: mov ax,data_seg
mov ds,ax
mov ah,display
mov dx,offset hello_message
int doscall
mov ax,4c00h
int doscall
code_seg ends
end start
Listing
= 0009
= 0021
0000
0000 48 65 6C 6C 6F 2C
20 77 6F 72 6C 64
21 0D 0A 24
0010
0000
0000
0000 B8 ---- R
0003 8E D8
0005 B4 09
0007 BA 0000 R
000A CD 21
000C B8 4C00
000F CD 21
0011
display
equ
9h
;display output function
doscall equ
21h
;DOS interrupt number
data_seg segment
hello_message db 'Hello, world!', 0dh, 0ah, '$'
data_seg ends
code_seg segment
assume cs:code_seg, ds:data_seg
start:
mov ax,data_seg
mov ds,ax
mov ah,display
mov dx,offset hello_message
int doscall
mov ax,4c00h
int doscall
code_seg ends
end start
คาสัง่ assume cs:code_seg, ds:data_segบอก assembler ว่า จะใช้ ds เป็ น
จุดเริ่มต้ นของ data_seg แต่หลังจาก DOS บรรจุโปรแกรมแบบ .EXE แล้ ว จะ
กาหนดให้ ds ชี ้ไปที่จดุ เริ่มต้ นของ PSP ท่านต้ องปรับให้ ds ชี ้มาที่ data_seg ด้ วย
คาสัง่ สองคาสัง่ ต่อไปนี ้
mov ax,data_seg
mov ds,ax
ท่านไม่สามารถใช้คาสั่งเดียว คือ
mov ds,data_seg
เพราะเป็ นข้อห้ามข้อคาสั่ง mov (ดู chapter 4 หน้า 4)
หมายเหตุ data_seg จะถูกปรับค่าให้ถกู ต้องเมื่อมีการบรรจุโปรแกรมนี้ใน
หน่วยความจา เพราะรู ้วา่ ได้บรรจุ data_seg ที่ใด
หมายเหตุ
1. Directive EQU
2. Operator OFFSET ซึ่งมีความหมายอธิบายได้ ด้วยตัวอย่าง ต่ อไปนี้
mov ax,OFFSET data กับ mov ax,data
สมมุตวิ ่ าใน Listing บอกว่ า data อยู่ที่ ออฟเซต 0020h และข้ อมูลทีอ่ อฟเซตดังกล่ าว คออ 25h
0020
data dw
25h
ถ้ าทาคาสั่ ง mov ax,offset data ค่ าใน ax จะเท่ ากับ 0020h
แต่ ถ้าทาคาสั่ ง mov ax,data ค่ าใน ax จะเท่ ากับ 0025h
สรุ ป ให้ มองว่ า data เป็ นตัวแปรตัวหนึ่งที่เก็บค่ า 25h ถ้ าต้ องการค่ าของตัวแปร data ให้ อ้าง
ถึงชอ่อตัวแปรนั้น คออ data แต่ ถ้าต้ องการอ้ างถึงที่อยู่ในทีน่ ีค้ ออ ค่ าออฟเซตของตัวแปร data
ให้ ใส่ operator OFFSET ข้ างหน้ า คออ OFFSET data เป็ นต้ น
แฟ้ มแบบ .exe มี header ตรงต้นแฟ้ ม เพื่อเก็บข้อมูลบางอย่าง เช่น MINALLOC, MAXALLOC,
MAGIC #, Relocation Table, และ CS:IP ที่จะเริ่ มต้น execute (ตรง directive END)
ใน Listing มี อักษร R ใช้เพื่อบอกให้ตวั เชื่อมโยง ปรับออฟเซตให้ถกู ต้อง เมื่อมี การเชื่อมโยง
ระหว่างหลายๆ segment ที่เขียนแยกจากกัน แล้วนามารวมเป็ น segment เดียวกัน ผูเ้ ขียน
โปรแกรมจึงไม่จาเป็ นต้องสนใจอักษร ดังกล่าว อักษรดังกล่าว จะไม่กินเนื้อที่ในหน่วยความจา
ตรง
0000 B8 ---- R
mov ax,data_seg
เนื่องจากช่วงการแปล ยังไม่รู้วา่ data_seg จะถูกบรรจุที่ตาแหน่งใดในหน่วยความจา assembler
จึงใส่ เครื่ องหมาย --- และมีอษั ร R เพื่อบอกให้รู้วา่ หลังการบรรจุโปรแกรมในหน่วยความจา
แล้ว ต้องมีการปรับค่าดังกล่าวให้ถูกต้อง ตาแหน่งดังกล่าว จะเก็บไว้ใน Relocation Table ตรง
header ของแฟ้ ม .exe
ดังนั้น ถ้าดูจาก Listing แล้ว ท่านจะสามารถตรวจสอบได้วา่ โปรแกรมดังกล่าว เป็ นโปรแกรม
แบบ .COM หรื อไม่ โดยพิจารณา ดังนี้
1. ตรง directive END เริ่ มที่ CS:0100h หรื อไม่ ถ้าไม่ แสดงว่าไม่ใช่โปรแกรมแบบ .COM
2. มี เครื่ องหมาย ---- R ที่กล่าวมาข้างต้นหรื อไม่ ถ้ามี แสดงว่าไม่ใช่โปรแกรมแบบ .COM
3. มี stack segment เช่น
my_stack segment STACK
my_stack ends เป็ นต้น
ถามี
แสดงวาไม
ใช
้
่
่ ่ โปรแกรมแบบ .COM
ถ้า ไม่ใช่โปรแกรมแบบ .COM ท่านไม่สามารถใช้ exe2bin เปลี่ยนจากแฟ้ ม .EXE เป็ น .COM
หมายเหตุ อย่าลืมว่า โปรแกรมแบบ .COM ต้องโตไม่เกิน 64K - 2 - 256