【发布时间】:2014-12-08 11:52:46
【问题描述】:
我正在编写一个关于 TASM 汇编语言的 DOS 命令行参数解析器。这是我的代码:
.model tiny
.386
.code
org 100h
start:
mov ax, ax
mov bp, 80h
mov si, 81h
mov ch, 0
mov cl, ds:[bp]
push 0
cmp cx, 0
je FINISH
CYCLE_BEGIN:
lodsb
cmp al, 2Fh
je SLASH
cmp al, 31h
je ONE
cmp al, 32h
je TWO
cmp al, 33h
je THREE
cmp al, 68h
je HELP
cmp al, 20h
je SPACE
mov bx, 6
jmp CHANGE_STATE
SLASH:
mov bx, 0
jmp CHANGE_STATE
ONE:
mov bx, 1
jmp CHANGE_STATE
TWO:
mov bx, 2
jmp CHANGE_STATE
THREE:
mov bx, 3
jmp CHANGE_STATE
HELP:
mov bx, 4
jmp CHANGE_STATE
SPACE:
mov bx, 5
CHANGE_STATE:
mov ax, 7
mul dx
add ax, bx
mov dh, 0
push si
mov si, offset AU
add si, ax
lodsb
mov dl, al
pop si
cmp dx, 6
JE ERROR
cmp dx, 1
je HAVEONE
cmp dx, 2
je HAVETWO
cmp dx, 3
je HAVETHREE
cmp dx, 4
je HAVEHELP
jmp CYCLE_END
HAVEONE:
mov ax, 0001h
jmp SETFLAGS
HAVETWO:
mov ax, 0010h
jmp SETFLAGS
HAVETHREE:
mov ax, 0100h
jmp SETFLAGS
HAVEHELP:
mov ax, 1000h
SETFLAGS:
pop bx
or bx, ax
push bx
CYCLE_END:
dec cx
jne CYCLE_BEGIN
jmp SUCCESS
ERROR:
pop bx
mov dx, offset merror
mov ah, 09h
int 21h
jmp FINISH
SUCCESS:
pop bx
mov dx, bx
and dx, 1000h
je MESSAGES_CHECK
mov dx, offset mhelp
mov ah, 09h
int 21h
jmp FINISH
MESSAGES_CHECK:
mov dx, bx
and dx, 0001h
je CHECK2
mov dx, offset m1
mov ah, 09h
int 21h
mov ah, 02h
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
CHECK2:
mov dx, bx
and dx, 0010h
je CHECK3
mov dx, offset m2
mov ah, 09h
int 21h
mov ah, 02h
mov dl, 0dh
int 21h
mov dl, 0ah
int 21h
CHECK3:
mov dx, bx
and dx, 0100h
je FINISH
mov dx, offset m3
mov ah, 09h
int 21h
FINISH:
RET
m1 db 'You have used /1 key$'
m2 db 'You have used /2 key$'
m3 db 'You have used /3 key$'
mhelp db 'ad.asm [/1 | /2 | /3| /h]$'
merror db 'Wrong input$'
AU:; / 1 2 3 h *
db 5,6,6,6,6,0,6 ;
db 6,6,6,6,6,0,6 ; /1
db 6,6,6,6,6,0,6 ; /2
db 6,6,6,6,6,0,6 ; /3
db 6,6,6,6,6,0,6 ; /h
db 6,1,2,3,4,6,6 ; /
db 6,6,6,6,6,6,6 ; err
end start
如果有/1,它应该打印m1的内容,如果有/2,它应该打印m2的内容,如果/3,它应该打印m3的内容。问题出在以下代码部分:
mov dx, offset m1
mov ah, 09h
int 21h
----
mov dx, offset m2
mov ah, 09h
int 21h
----
mov dx, offset m3
mov ah, 09h
int 21h
它不打印任何东西。即使我在 Turbo Debugger 中看到代码已到达并且dx 中有正确的偏移量,int 21h 之后的标准输出中也没有文本。为什么?
【问题讨论】:
-
我只能使用dosbox进行检查,它在那里工作正常。
-
@Jester 你是如何编译代码的?
-
tasm test.asm和tlink /t test.obj