|   ภาษาแอสเซมบลี้ และ การแปล | 
| ปรับปรุง : 2566-01-31 (ปรับรุ่นเป็น 9.0) |  | 
| Digital logic | OS | คำสั่งดอส | Batch | Debug | Assembly | GWBasic | Docker | | 
| 
 | 
| ตัวอย่างการดู register ด้วยโปรแกรม debug C:\MASM611\BIN>debug -r AX=0000 BX=0000 CX=0000 DX=0000 SP=FFEE BP=0000 SI=0000 DI=0000 DS=119B ES=119B SS=119B CS=119B IP=0100 NV UP EI PL NZ NA PO NC 119B:0100 C8 DB C8 -q C:\MASM611\BIN> | 
| วิธีติดตั้งตัวแปลภาษา Assembly 1. ตัวแปลภาษา : masm611.zip 4.7 MB และ dosbox074.zip 1.4 MB 2. คลาย zip ลงในเครื่อง 3. สั่ง run โปรแกรม setup.exe 4. กด Enter ประมาณ 20 ครั้ง - เมื่อ enter ที่ 12 ควรเปลี่ยน binr เป็น bin 5. ถ้าพบ Setup Successfully กด Ctrl-C ได้ 6. โปรแกรมทั้งหมดอยู่ในห้อง c:\masm611 7. พบตัวแปลภาษาใน c:\masm611\bin\ 8. ถ้าขณะ install ถ้าไม่เปลี่ยน bin เป็น binr - ต้อง cd c:\masm611\binr - ต้อง copy *.* c:\masm611\bin - จึงจะแปลโปรแกรมได้สำเร็จ ตามตัวอย่าง |   | 
| วิธีแปล (Compile) ลิงค์(Link) และสั่งประมวลผล(Execute) การสั่งแปล source code ให้ได้ .exe ด้วย c:\masm611\bin>a sample1 สร้าง a.bat ด้วย notepad masm %1.asm link %1,,,,, %1 ประโยชน์ของโปรแกรม a.bat คือ ช่วยแปล ลิงค์ และประมวลผล ในคำสั่งเดียว   | 
| 1. แสดงการสร้างโปรแกรมใช้งาน interrupt :: สร้างโปรแกรม 2 byte .com เป็นบริการของ bios เพื่อแสดง Divide overflow ถ้าเป็น Windows XP จะแสดงข้อความเท่าที่เห็น แต่ถ้าเป็น 98 จะแสดงดังตัวอย่างด้านล่าง | 
| C:\>debug test.com -a 11BD:0100 int 0h 11BD:0102 -rcx CX 0001 :2 -w Writing 00002 bytes -q C:\>test.com Your program caused a divide overflow error. If the problem persists, contact your program vendor. C:\> | 
| 2. แสดงการประมวลผลใน debug อย่างง่าย :: ใช้คำสั่ง mov shr และ int 21 สำหรับ int 20 เป็นการหยุดการทำงาน | 
| C:\>debug -a 100 0AE8:0100 mov ah,02 0AE8:0102 mov dl,51 0AE8:0104 int 21 0AE8:0106 shr dl,1 0AE8:0108 shl dl,1 0AE8:010A int 21 0AE8:010C int 20 0AE8:010E -g QP Program terminated normally - | 
| 3. แสดงใช้ directive segment ends แบบเก่า :: พิมพ์ตัวอักษร a จนกระทั่งกดปุ่ม ctrl-break จึงหยุดการทำงาน | 
| 
        ; a1.asm compile by MASM611
cseg    segment
        assume cs:cseg,ds:cseg    ; Code segment, Data segment
        push    cs
        pop     ds
        jmp     start             ; กระโดดไป start label
msg1    db      'a',0dh,0ah,'$'
start:  mov     ah,09h            ; พิมพ์ string ทางจอภาพ
        lea     dx,msg1
        int     21h
        mov     ah,01h            ; รับค่าจากแป้นพิมพ์
        int     21h
        jmp     start
cseg    ends                      ; ปิด segment
        end                       ; เลิกการทำงาน
 | 
| 4. แสดงการทำซ้ำด้วย label, cmp, je :: โปรแกรมนี้ใช้ directive .model .data .code .stack มิได้ใช้ segment ends แบบเก่า :: Loop รับ 1 อักษร จากบริการ int21 สำหรับที่ ah,06 และ dl,ff แต่พิมพ์ซ้ำตลอดกาล จนรับ e หรือ E จึงหยุด โปรแกรมนี้ชื่อ x.asm ถูกแปลด้วย MASM611 ซึ่งเป็นแนวการเขียนโปรแกรมแบบ .exe โปรแกรมที่ได้มีขนาด 578 Byte | 
| 
; Get char and repeat print char until e or E
        .model  small   
        .data
x1      db      "type e or E to Exit",0ah,0dh,'$'        
        .code
pmain   proc    far     ; can not change far to near 
        push    ds      ; 1 of 5 line required for end .exe
        mov     ax,0    ; 2 clear ax by xor  ax,ax
        push    ax      ; 3 send ax to stack
        mov     ax,@data
        mov     ds,ax
start:  mov     ah,09h  ;  พิมพ์ string ทางจอภาพ
        lea     dx,x1
        int     21h
        mov     ah,06h  ; รับ char จากแป้นพิมพ์ส่งเข้า al
top:    mov     dl,0ffh ; ถ้า dl เป็น ff จะรับค่าจาก console แบบไม่หยุดรอ
        int     21h
        jz      typeo   ; ถ้าไม่กดอะไร จะไป typeo เพราะ ah ค้างที่ 6 อยู่
        mov     cl,al   ; เก็บตัวอักษรใน al ไว้กลัวหาย
        cmp     al,'E'
        je      finish
        cmp     al,'e'
        je      finish
typeo:  mov     dl,cl   ; ถ้า dl ไม่เป็น ff จะส่งค่าใน al ไป console
        int     21h
        jmp     top
finish: ret             ; ไม่สามารถใช้ int20 เพื่อสั่งให้เลิกงาน
pmain   endp
        .stack  200h    ; not required
        end     pmain
        .model  small   
        .data
msg1      db      'Hello ','$'
msg2      db      'World','$'
        .code
pmain   proc    far
        push    ds  
        mov     ax,0
        push    ax  
        mov     ax,@data
        mov     ds,ax
start:  mov     ah,09h
        lea     dx,msg1
        int     21h
        lea     dx,msg2
        int     21h
finish: ret
pmain   endp
        end     pmain
 | 
| 5. แสดงการเขียน macro :: แสดงเทคนิคการใช้ macro ในภาษา assembly | 
| 
setproc macro
        push    ds      ; 1 of 5 line required for end .exe
        mov     ax,0    ; 2 clear ax by xor  ax,ax
        push    ax      ; 3 send ax to stack
        mov     ax,@data
        mov     ds,ax
        endm	
prtout  macro
        mov     ah,09h
        lea     dx,msg
        int     21h
        endm
; =============
; Main program
; =============
        .model  small
        .data
msg     db      'This is the program testing $'
        .code
pmain   proc    far     ; can not change far to near 
        setproc
        prtout
        ret
pmain   endp
        .stack  200h    ; not required
        end     pmain
 | 
|   | ช่วงปี 48 และ 49 ผมได้มีโอกาสเรียน Digital Computer กับอาจารย์ Hans ชาวเยอรมัน ในหลักสูตรสั้น ๆ ท่านสอนให้รู้จัก pspice สำหรับวาด Logic Gate และจบด้วยการใช้โปรแกรม Computer Simulation เพื่อแสดงการทำงานของคอมพิวเตอร์ โดยเฉพาะคำสั่งภาษา Assembly, Memory, Control Bus, Address Bus, Data Bus, Register และ CPU โปรแกรมนี้ท่านเคยนำเสนอมาครั้งหนึ่ง แต่ใช้ได้เฉพาะเครื่องเก่า ต่อมาผมตรวจพบว่าเขียนด้วย Pascal 7.0 จึงหา Patch มาแก้ปัญหา และสามารถนำมาใช้ได้กับเครื่องใหม่ รวมทั้งการแก้ไขภาษาเยอรมันบางส่วนเป็นภาษาไทย | 
|   | โปรแกรม Assembler-Intel 8086 พบในเว็บเพจของ อ.ธนาวินท์ ที่สอน 204221 : Computer Organization and Assembly Language ซึ่งมี Powerpoint ที่ละเอียดมาก และพบว่าโปรแกรม emu8086 สามารถ download ได้จาก http://www.emu8086.com | 
| 
 
 | 
| "ไม่เริ่มต้นในวันนี้ จะไม่มีทางสำเร็จในวันพรุ่ง" โดย โยฮัน ว็อล์ฟกัง ฟ็อน เกอเทอ |