Assume в ASM - непонятки
следующий код работает неправильно, я начинаю
отлаживать программу debug-ером - и вижу что
программа начинает исполняется с первого сегмента!?
title CharProcessing
text segment
txt db 200 dup (?)
text ends
stack segment
S db 100 dup (?)
stack ends
INCH macro x
mov ah, 7h
int 21h
mov bl, al
mov x, bl
endm
OUTCH macro c
mov dl, c
mov ah, 2h
int 21h
endm
FINISH macro
mov ax, 4C00h
int 21h
endm
NEWLINE macro
OUTCH 13
endm
code segment
assume cs: code, ds: text, ss: stack
; set start params
OUTCH '>'
cld
mov ax, text
mov ds, ax
mov ax, stack
mov ss, ax
mov di, 0h
mov si, 0h
; read text
Read:
INCH al
cmp al, '.'
je Next
stosb
jmp Read
; print source text
Next:
lodsb
OUTCH al
cmp si, di
jbe Next
; test
mov al, [di]
cmp al, 'A'
jb Prop2
cmp al, 'Z'
jg Prop2
mov si, 0h
Next2:
cmp al, ds: [si]
je Prop2
inc si
cmp si, di
jb Next2
call rule1
jmp Result
Prop2:
call rule2
jmp Result
; rule # 1
rule1 proc
mov si, 0h
L:
lodsb
cmp al, 'a'
jb Cont
cmp al, 'z'
jg Cont
add al, 32
mov ds: [si], al
Cont:
cmp si, di
jbe L
ret
rule1 endp
; rule # 2
rule2 proc
mov si, di
mov cx, si
std
L1:
lodsb
push ax
loop L1
cld
mov cx, di
mov di, 0h
L2:
pop ax
mov ah, al
stosw
loop L2
ret
rule2 endp
; print result code
NEWLINE
Result:
mov cx, di
L:
lodsb
OUTCH al
loop L
FINISH
code ends
end
title CharProcessing
text segment
txt db 200 dup (?)
text ends
stk segment stack
db 100 dup (?)
stk ends
code segment
assume cs: code, ds: text, ss: stk
; дальше объявления макросов
;--------------------------------
INCH macro x
mov ah, 7h
int 21h
mov bl, al
mov x, bl
endm
;---------------------------------
OUTCH macro c
mov dl, c
mov ah, 2h
int 21h
endm
;---------------------------------
FINISH macro
mov ax, 4C00h
int 21h
endm
;---------------------------------
NEWLINE macro
OUTCH 13
endm
;---------------------------------
; теперь основная прога
begin:
mov ax, text
mov ds, ax
mov ax, stk
mov ss, ax
;---------------------------------
; здесь код проги
;---------------------------------
; и наконец выход
mov ah, 4ch
int 21h
code ends
end begin
Обрати внимание как стек надо делать :). Теперь должно работать!!! :D