วันพฤหัสบดีที่ 13 สิงหาคม พ.ศ. 2552

มาโครแอสเซมเบลอร์

ในหัวข้อนี้จะแสดงตัวอย่างการใช้งานเครื่องมือดังกล่าวโดยใช้ตัวอย่างโปรแกรม upcase.asm จากบทที่แล้ว เครื่องมือที่จะกล่าวถึงในที่นี้ได้แก่

· MASM
· LINK
การใช้ MASM
MASM จะนำแฟ้ม .asm มาสร้างเป็นแฟ้มรหัสภาษาเครื่องนามสกุล .obj การใช้คำสั่ง MASM มีรูปแบบดังนี้คือ

masm ค่าเผื่อเลือก แฟ้ม .asm, [แฟ้ม .obj], [แฟ้ม .lst], [แฟ้ม .crf]

หากต้องการเฉพาะแฟ้ม .obj อย่างเดียวให้ใช้เครื่องหมายอัตภาคปิดท้ายชื่อแฟ้มดังนี้

masm upcase;

หากต้องการแฟ้ม .obj, lst และ .crf โดยยังคงชื่อแฟ้มไว้ตามชื่อแฟ้ม .asm ให้ป้อนเครื่องหมายจุลภาคโดยไม่ใส่ชื่อแฟ้มตามตัวอย่าง

masm upcase,,,

หากเรียกใช้ MASM แปลโปรแกรมโดยไม่กำหนดพารามิเตอร์เพิ่มเติม MASM จะถามถึงชื่อแฟ้มที่ต้องการสร้างดังนี้


c:\>masm upcase.asm
Microsoft (r) macro assembler version 5.00
Copyright (c) microsoft corp 1981-1985, 1987. All rights reserved

Object filename [UPCASE.OBJ]:
Source listing [NUL.LST]: UPCASE.LST
Cross-reference [NUL.CRF]:

50850 + 406270 bytes symbol space free

0 Warning Errors
0 Severe Errors






แฟ้ม .lst
แฟ้ม upcase.lst ที่ได้จากการแปลโปรแกรม upcase.asm จะมีสามหน้า หน้าแรกและหน้าที่สองบรรจุคำสั่งที่กำกับด้วยรหัสภาษาเครื่องและหมายเลขบรรทัดไว้ดังรูปที่ 5.1 ตัวอย่างเช่นในบรรทัดที่ 33 มีตัวเลข 8e d8 ซึ่งเป็นรหัสคำสั่ง mov ds,ax ส่วนในบรรทัดที่ 37 มีรหัส ba 0028 R ซึ่งเป็นรหัสของคำสั่ง mov dx
รหัส 0028 R หมายถึงค่าที่ต้องรอการคำนวณภายหลัง ในที่นี้คือค่าออฟเซ็ตของตัวแปร msg_out1 ในขั้นของการลิงค์จะมีการคำนวณตำแหน่งออฟเซ็ตที่แท้จริงของ msg_out1 และนำมาแทนค่า R

Microsoft (R) Macro Assembler Version 5.00 8/19/96 15:22:13
Page 1-1


1 ; upcase.asm
2 ; read string from keyboard and change
3 ; to upper case (undetect errors)
4 ;--------------------------------------
5 ;
6 dosseg
7 .model small
8
9 ;reserved space for satck
10 0100 .stack 100h
11
12 ;variable and constant
13 0000 .data
14 0000 25 max_len db 25h
15 0001 ?? inp_len db ?
16 0002 0026[ str_buff db 26h dup (20h)
17 20
18 ]
19
20 0028 69 6E 70 75 74 20 73 msg_out1 db 'input string : $'
21 74 72 69 6E 67 20 3A
22 20 24
23 0038 0D 0A 75 70 70 65 72 msg_out2 db 0dh,0ah,'upper case : $'
24 20 63 61 73 65 20 20
25 20 3A 20 24
26
27 ;
28 ;start of program
29 ;
30 0000 .code
31 ; init data segment
32 0000 B8 ---- R start: mov ax,@data
33 0003 8E D8 mov ds,ax
34
35 ; display input message
36 0005 B4 09 mov ah,9
37 0007 BA 0028 R mov dx,offset msg_out1
38 000A CD 21 int 21h
39
40 ; read string
41 000C BA 0000 R mov dx,offset max_len
42 000F B4 0A mov ah,0ah
43 0011 CD 21 int 21h
44
45 ; display output message
46 0013 B4 09 mov ah,9
47 0015 BA 0038 R mov dx, offset msg_out2
48 0018 CD 21 int 21h
49
50 ; prepare pointer and counter
51 001A BB 0001 R mov bx, offset inp_len
52 001D 8A 0F mov cl,[bx]
53 001F 43 inc bx
54
55 ; convert to upper case and display
56 0020 B4 02 next_char: mov ah,2
57 0022 8A 17 mov dl,[bx]
58 0024 80 EA 20 sub dl,20h
59 0027 CD 21 int 21h
60 0029 43 inc bx
61 002A FE C9 dec cl
62 002C 75 F2 jnz next_char
63
64 ; return to dos with errorlevel 0
65 002E B8 4C00 mov ax,4c00h
66 0031 CD 21 int 21h
67
68 0033 end start
69

รูปที่ 5.1 แฟ้ม UPCASE.LST


หน้าที่สามของแฟ้ม upcase.lst เป็นข้อมูลเกี่ยวกับเซกเมนต์และการใช้ตัวแปร ตลอดจนขนาดของตัวโปรแกรมดังแสดงในรูปที่ 5.2
Microsoft (R) Macro Assembler Version 5.00 8/19/96 15:22:13
Symbols-1


Segments and Groups:

N a m e Length Align Combine Class

DGROUP . . . . . . . . . . . . . GROUP
_DATA . . . . . . . . . . . . 004A WORD PUBLIC 'DATA'
STACK . . . . . . . . . . . . 0100 PARA STACK 'STACK'
_TEXT . . . . . . . . . . . . . 0033 WORD PUBLIC 'CODE'

Symbols:

N a m e Type Value Attr

INP_LEN . . . . . . . . . . . . L BYTE 0001 _DATA

MAX_LEN . . . . . . . . . . . . L BYTE 0000 _DATA
MSG_OUT1 . . . . . . . . . . . . L BYTE 0028 _DATA
MSG_OUT2 . . . . . . . . . . . . L BYTE 0038 _DATA

NEXT_CHAR . . . . . . . . . . . L NEAR 0020 _TEXT

START . . . . . . . . . . . . . L NEAR 0000 _TEXT
STR_BUFF . . . . . . . . . . . . L BYTE 0002 _DATA Length = 0026

@CODE . . . . . . . . . . . . . TEXT _TEXT
@CODESIZE . . . . . . . . . . . TEXT 0
@DATASIZE . . . . . . . . . . . TEXT 0
@FILENAME . . . . . . . . . . . TEXT upcase


61 Source Lines
61 Total Lines
21 Symbols

50850 + 406270 Bytes symbol space free

0 Warning Errors
0 Severe Errors


รูปที่ 5.2 ข้อมูลทั่วไปกำกับท้ายโปรแกรม


การใช้ link
แฟ้ม upcase.obj เมื่อนำไปผ่านโปรแกรม LINK จะได้แฟ้ม upcase.exe ที่สามารถนำไปใช้งานได้ คำสั่ง LINK มีรูปแบบการใช้งานดังนี้คือ

masm /ค่าเผื่อเลือก แฟ้ม .asm, [แฟ้ม .obj], [แฟ้ม .lst], [แฟ้ม .crf]

หากต้องการเฉพาะแฟ้ม .EXE อย่างเดียวให้ใช้เครื่องหมายอัตภาคปิดท้ายชื่อแฟ้มดังนี้

link upcase;

หากต้องการให้สร้างชื่อแฟ้มตามชื่อที่กำหนดไว้โดยตัวโปรแกรม LINK เองให้ป้อนเครื่องหมายตามตัวอย่าง

link upcase,,,;

หากเรียกใช้ LINK แปลงโปรแกรมโดยไม่กำหนดพารามิเตอร์เพิ่มเติม LINK จะถามถึงชื่อแฟ้มที่ต้องการสร้างและแฟ้มอินพุตดังนี้

C:\>link upcase

Microsoft (R) Segmented-Executable Linker Version 5.13
Copyright (C) Microsoft Corp 1984-1991. All rights reserved.

Run File [UPCASE.EXE]:
List File [NUL.MAP]:
Libraries [.LIB]:
Definitions File [NUL.DEF]:

ไม่มีความคิดเห็น:

แสดงความคิดเห็น