การใช้โปรแกรมดีบัก (Debug program)
Digital logic | OS | คำสั่งดอส | Batch | Debug | Assembly | GWBasic | Docker |

มีเรื่องเล่าว่า เครื่องคอมพิวเตอร์ในปี 1946 ทำงานผิดปกติ เมื่อ Grace Hopper ทหารเรือหญิงและนักวิทยาศาสตร์คอมพิวเตอร์ ตรวจสอบโดยละเอียดพบว่ามีผีเสื้อกลางคืน (Bug แมลง) บินไปเกาะบนแผงวงจรของเครื่อง Mark-II เมื่อนำแมลงออกมา ระบบต่าง ๆ ก็ทำงานได้ตามปกติ ปัจจุบันจึงเรียกการแก้ปัญหาที่เกี่ยวกับเครื่องคอมพิวเตอร์ว่าการดีบัก (Debug)
ดีบัก (Debug) คือ โปรแกรมที่พัฒนาเพื่อแก้ไขปัญหาพื้นฐานในระบบปฏิบัติการดอส (DOS = Disk Operation System) เป็นโปรแกรมสำหรับแก้ไขแฟ้มอย่างง่าย เป็นคำสั่งภายนอก (External Command) ของดอส (DOS) ที่นิยมใช้งานในกลุ่มนักพัฒนามาตั้งแต่ยุคระบบปฏิบัติการดอส

Download : Doxbox (DOSBox0.74-win32-installer.exe)
z:\>mount d d:\
+ Download: https://www.dosbox.com/download.php?main=1
+ Download: https://www.facebook.com/groups/thaiebook/919026384914847/

Download : Debug.com
unzip debugx.zip (152 KB) in d:\
z:\>d:
d:\>debug.com
+ Download: https://sites.google.com/site/pcdosretro/enhdebug/DEBUGX.ZIP?attredirects=0
+ Download: https://www.facebook.com/groups/thaiebook/919026258248193/
+ Detail : http://thestarman.pcministry.com/asm/debug/debug.htm
? คือการแสดงคำสั่งที่ใช้งานได้ของ 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
-

? ดูข้อมูลใน Register
C:\>debug
-t
AX=0000  BX=0000  CX=0000  DX=0011  SP=FFEE  BP=0000  SI=0000  DI=0000
DS=0AE8  ES=0AE8  SS=0AE8  CS=0AE8  IP=0102   NV UP EI PL NZ NA PO NC
-

EXAMPLE :: ตัวอย่างการใช้ SHL
- SHL คือย้ายบิท เข้าไปทางซ้าย
- DFFD = 1101 1111 1111 1101
- BFFA = 1011 1111 1111 1010
C:\>debug
-a 100
0B24:0100 mov dx,dffd
0B24:0103 shl dx,1
0B24:0105

-r
AX=0000  BX=0000  CX=0000  DX=0000  SP=FFEE  BP=0000  SI=0000  DI=01B8
DS=0B24  ES=0B24  SS=0B24  CS=0B24  IP=0103   OV UP EI PL NZ NA PE CY
0B24:0103 D1E2          SHL     DX,1

-t =cs:100 2
AX=0000  BX=0000  CX=0000  DX=DFFD  SP=FFEE  BP=0000  SI=0000  DI=01B8
DS=0B24  ES=0B24  SS=0B24  CS=0B24  IP=0103   OV UP EI PL NZ NA PE CY
0B24:0103 D1E2          SHL     DX,1

AX=0000  BX=0000  CX=0000  DX=BFFA  SP=FFEE  BP=0000  SI=0000  DI=01B8
DS=0B24  ES=0B24  SS=0B24  CS=0B24  IP=0105   NV UP EI NG NZ NA PE CY
0B24:0105 D1E2          SHL     DX,1
-


โปรแกรมนี้แสดงการเขียน assembly ใน DOS และการสั่งประมวลผลด้วยคำสั่ง g
การเขียนโปรแกรมนี้ได้ต้องเข้าใจว่า int 20 คืออะไร int 21 ใช้อย่างไร และ 41 คืออักษรอะไร และที่สำคัญต้องเข้าใจว่า debug มีคำสั่งอะไรให้ใช้บ้าง
C:\>debug
-a
106F:0100 mov ah,02
106F:0102 mov dl,41
106F:0104 int 21
106F:0106 int 20
106F:0108
-g
A
Program terminated normally
- n x.com
- rcx
: 8
- w
- q
C:\>x
A
C:\>
    สรุปคำสั่ง 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 ที่กำหนด
    -i 2f8 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 ที่กำหนด
    -o 2f8 p :: Proceed สั่งประมวลผล แต่ต้องมีโปรแกรมที่ทดสอบได้นะครับ
    -p =100
    -p q :: Quit เลิกการทำงาน
    -q 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
    -w
- รับอักษร ด้วยบริการ AH=8 แบบไม่แสดงผล
- แสดงอักษร ด้วยบริการ 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
    -
    

การ clear password ของ BIOS ถ้าเข้าในฐานะ Admin ไม่ได้
+ http://www.wikihow.com/Break-a-BIOS-Password
+ http://www.go4expert.com/forums/showthread.php?t=114
+ http://rahulhackingarticles.wetpaint.com/page/Clear+BIOS+Password,+All+tricks+!?t=anon
Boot DOS by Windows98 and DOS>debug
for : AWARD BIOS
-o 70 2e
-o 71 17
-q
and reboot
for : AMI/AWARD BIOS -o 70 17 -o 71 17 -q and reboot
for : PHOENIX BIOS -o 70 FF -o 71 17 -q and reboot
for : GENERIC Invalidates CMOS RAM. Should work on all AT motherboards (XT motherboards don't have CMOS) -o 70 2E -o 71 FF -q and reboot
Command line เป็น emulator บน web browser

jamesfriend.com.au

bellard.org

dosbox.com
มีบริการให้ใช้งาน shell ของ DOS และ Linux ผ่าน browser โดยใช้ javascript เป็นตัวพัฒนา เหมาะกับผู้ที่ต้องการเรียนรู้ และทดสอบคำสั่งพื้นฐาน 1) ถ้าต้องการใช้ DOS shell หรือ command line ผ่าน online emulator เข้าใช้ที่ jamesfriend.com.au 2) ถ้าต้องการใช้ Linux shell ผ่าน online emulator เข้าใช้ที่ bellard.org มีตัวอย่างคำสั่ง linux ที่ /isinthai 3) ถ้าจะ DOS Shell บน windows ก็จะมี DOSBOX เป็น x86 emulator Downoad : dosbox.com แล้วก็ติดตั้ง ผมเคยเขียนตัวอย่างการใช้งาน DOSBOX ที่ thaiall.com