คำสั่งพื้นฐานของ debug ภาษา Assembly

ตอบกระทู้

รูปแสดงอารมณ์
:icon_plusone: :like: :plusone: :gfb: :-D :) :( :-o 8O :? 8) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: :angry: :baa: :biggrin:
รูปแสดงอารมณ์อื่นๆ

BBCode เปิด
[img] เปิด
[url] เปิด
[Smile icon] เปิด

กระทู้แนะนำ
   

มุมมองที่ขยายได้ กระทู้แนะนำ: คำสั่งพื้นฐานของ debug ภาษา Assembly

คำสั่งพื้นฐานของ debug ภาษา Assembly

โดย ธวัชชัย แสนหาญ » 26/11/2018 3:00 pm

Debug (ดีบัก) คือ โปรแกรมที่พัฒนา
เพื่อแก้ไขปัญหาพื้นฐานในระบบปฏิบัติการดอส (DOS = Disk Operation System)
เป็นโปรแกรมสำหรับแก้ไขแฟ้มอย่างง่าย เป็นคำสั่งภายนอก (External Command)
ของดอส (DOS) ที่นิยมใช้งานในกลุ่มนักพัฒนามาตั้งแต่ยุคระบบปฏิบัติการดอส
รูปภายในโปรแกรม
Capture01.PNG
Capture01.PNG (57.21 KiB) Viewed 2506 times
? คือการแสดงคำสั่งที่ใช้งานได้ของ debug

โค้ด: เลือกทั้งหมด

C:\>debug
-?
assemble     A [address]
compare      C range address เปรียบเทียบ
dump         D [range]  แสดงข้อมูล
enter        E address [list] แก้ไขข้อมูล
fill         F range list เติมลงในช่องที่กำหนด
go           G [=address] [addresses]  สั่งประมวลผล
hex          H value1 value2
input        I port
load         L [address] [drive] [firstsector] [number]
move         M range address
name         N [pathname] [arglist]
output       O port byte
proceed      P [=address] [number]
quit         Q
register     R [register]
search       S range list
trace        T [=address] [value]
unassemble   U [range]
write        W [address] [drive] [firstsector] [number]
allocate expanded memory        XA [#pages]
deallocate expanded memory      XD [handle]
map expanded memory pages       XM [Lpage] [Ppage] [handle]
display expanded memory status  XS
สรุปคำสั่ง debug
เลขที่ใช้คือ 0000 หมายถึงเลขฐาน 16 จำนวน 4 หลัก สูงสุดคือ ffff
a :: Assemble แปลภาษา aassembly ไปแปลเป็นภาษาเครื่อง (enter 2 ครั้งเมื่อจบ)

โค้ด: เลือกทั้งหมด

C:\assembly>debug

-n i.com

-a cs:100

106F:0100 mov ah,08

106F:0102 int 21

106F:0104 mov ah,4c

106F:0106 int 21

106F:0108

-rcx

CX 0000

:8

-w

Writing 00008 bytes

-q
c :: Compare เปรียบเทียบ

โค้ด: เลือกทั้งหมด

-c cs:100 102 ds:1a0

1090:0100  B4  1E  1090:01A0

1090:0101  08  B4  1090:01A1

1090:0102  CD  52  1090:01A2

-
d :: Dump แสดงข้อมูล

โค้ด: เลือกทั้งหมด

-d cs:100 200

-d cs:100 107 (แสดงเพียง 7 ตัวอักษรจากตำแหน่ง 100 - 107)

-d cs:100
e :: Enter แก้ไขข้อมูล

โค้ด: เลือกทั้งหมด

-e cs:4a5 41 42 43
f :: Fill เติมลงในช่องที่กำหนด

โค้ด: เลือกทั้งหมด

-f cs:100 107 "abc" (ทำให้ทั้งแฟ้มมีแต่ abc)

-f cs:103 105 "d" (ทำให้ตัวที่ 4 ถึง 6 เป็นอักษร d)
g :: Go สั่งประมวลผล

โค้ด: เลือกทั้งหมด

-g 

-g 102 ประมวลผลไปถึง address ที่ต้องการ
h :: Hexarithmatic คำนวณเลขฐาน 16

โค้ด: เลือกทั้งหมด

-h  f 8

0017  0007 (ผลลัพธ์คือผลบวก และผลต่าง)

-h 111 110

0221  0001 (ผลลัพธ์คือผลบวก และผลต่าง)
i :: Input อ่านข้อมูลจาก port ที่กำหนด
l :: Load เรียกข้อมูลจาก disk ใหม่ ถ้าเคย Load มาแล้วก็หมายถึง Load มาทับของเดิมในหน่วยความจำ

โค้ด: เลือกทั้งหมด

-n inkey.com

-l 
m :: Move ย้ายข้อมูล 6 อักษรไปเริ่มทับตำแหน่งที่ 130 เป็นต้นไป

คัดลอกจาก 100 ไปถึง 106 รวม 6 byte ไปตำแหน่งที่ 130

โค้ด: เลือกทั้งหมด

-m cs:100 106 130
n :: Name กำหนดชื่อแฟ้มที่จะ load หรือ write

โค้ด: เลือกทั้งหมด

-n inkey.com
o :: Output ส่งข้อมูลออกทาง port ที่กำหนด
p :: Proceed สั่งประมวลผล แต่ต้องมีโปรแกรมที่ทดสอบได้

โค้ด: เลือกทั้งหมด

-p =100

-p
q :: Quit เลิกการทำงาน
r :: Register เรียกดู หรือแก้ไขค่าใน register

ค่าของ IP จะไม่เลื่อนเหมือนการใช้ t ที่ประมวลผล และทำให้ตำแหน่งของ IP เลื่อนไป แต่คำสั่ง r จะแสดงค่าเดิมทุกครั้ง

โค้ด: เลือกทั้งหมด

-r 

-r ax (แล้วกรอกค่าที่ต้องการ)
s :: Search ค้นหา

โค้ด: เลือกทั้งหมด

-s cs:100 110 41
t :: Trace ประมวลผล แล้วแสดงผลทีละคำสั่ง ตัวอย่างนี้ทำเพียง 3 บรรทัดคำสั่ง

ค่าของ IP จะเลื่อนไป IP ถัดไป ไม่เหมือนคำสั่ง r ที่แสดงค่าเหมือนเดิมทุกครั้ง

โค้ด: เลือกทั้งหมด

-t =cs:100 3 

-t
u :: Unassemble แปลจากภาษาเครื่องมาเป็น assembly

โค้ด: เลือกทั้งหมด

-u 

1091:0100 B408          MOV     AH,08

1091:0102 CD21          INT     21

1091:0104 B44C          MOV     AH,4C

1091:0106 CD21          INT     21

-
w :: Write เขียนข้อมูลจากหน่วยความจำลง disk
- รับอักษร ด้วย AH=08 แบบไม่แสดงผล
- แสดงอักษร ด้วย AH=02
- ตัวอย่างนี้ทดสอบกด a หนึ่งครั้ง จะแสดงอักษร a มา 3 ครั้ง

โค้ด: เลือกทั้งหมด

C:\>debug
-n x.com
-a
0AEA:0100 mov ah,08
0AEA:0102 int 21
0AEA:0104 mov dl,al
0AEA:0106 mov ah,02
0AEA:0108 int 21
0AEA:010A int 21
0AEA:010C int 21
0AEA:010E int 20
0AEA:0110
-rcx
CX 0000
:10
-w
Writing 00010 bytes
-g
aaa
Program terminated normally
-

ข้างบน