.model small .stack 400h .data outStr db 11 DUP ('$') msg_error db "Error!!!", 13, 10, '$' FileName db "c:\labs\input.txt", 0 buffer db 20h DUP (?) .code ;word ReadWordFromFile (char* file_name, word offset) : AX ReadWordFromFile proc near push bp mov bp, sp ;save registers push bx push cx push dx push si ;===================== ; Offset's description ;=== ;arguments __rwff_file_name = 6 ;file name __rwff_offset = 4 ;offset in file in bytes ;+++ __rwff__stack_par_offset = 4 ;offset for function parameters ;local variables __rwff_FileHandle = 8 ;File handle __rwff_FileSize = 10 ;File size __rwff_readed = 12 ;Real readed bytes __rwff_sign = 14 ;Value sign __rwff_buffer = 16 ;Char buffer array ;+++ __rwff__stack_offset = 8 ;offset for local variables sub sp, __rwff__stack_offset ;===================== ; FileHandle = OpenFile(file_name); mov dx, [bp + __rwff_file_name] mov al, 0 mov ah, 3Dh int 21h ;OpenFile jnc @__line_37 jmp far ptr @__rwff_Error @__line_37: mov [bp - __rwff_FileHandle], ax ; FileSize = LSeek(FileHandle, 0, SEEK_END) mov bx, [bp - __rwff_FileHandle] ;FileHandle mov cx, 0 ;Offset mov dx, 0 mov al, 2 ;SEEK_END mov ah, 42h int 21h jnc @__line_49 jmp far ptr @__rwff_Error @__line_49: mov [bp - __rwff_FileSize], ax ; LSeek(FileHandle, offset, SEEK_SET) mov bx, [bp - __rwff_FileHandle] ;FileHandle mov cx, [bp + __rwff_offset] ;offset mov dx, 0 mov al, 0 ;SEEK_SET mov ah, 42h int 21h jnc @__line_61 jmp far ptr @__rwff_Error @__line_61: ; char* buffer = new char[FileSize] mov [bp - __rwff_buffer], sp mov ax, [bp - __rwff_FileSize] sub sp, ax ; readed = FRead(FileHandle, buffer, FileSize - offset) mov bx, [bp - __rwff_FileHandle] ;FileHandle lea dx, buffer ;[bp - __rwff_buffer] ;buffer mov cx, [bp - __rwff_FileSize] ;FileSize - offset sub cx, [bp + __rwff_offset] mov ah, 3Fh int 21h jnc @__line_77 jmp far ptr @__rwff_Error @__line_77: mov [bp - __rwff_readed], ax ;parse string mov cx, [bp - __rwff_readed] mov word ptr [bp - __rwff_sign], 0 mov bx, 10 xor ax, ax xor si, si xor dx, dx @__rwff_parseLoop: mov dl, buffer[si] ;byte ptr [bp - __rwff_buffer + si] cmp dl, 13 je @__rwff_parseLoop_exit cmp dl, 10 je @__rwff_parseLoop_exit cmp dl, 32 je @__rwff_parseLoop_exit cmp dl, '-' jne @__rwff_parseLoop_checkInt cmp si, 0 jne @__rwff_parseLoop_error mov word ptr [bp - __rwff_sign], 1 jmp @__rwff_parseLoop_continue @__rwff_parseLoop_checkInt: cmp dl, '0' jl @__rwff_parseLoop_error cmp dl, '9' jg @__rwff_parseLoop_error push dx imul bx pop dx sub dl, 30h add ax, dx @__rwff_parseLoop_continue: inc si loop @__rwff_parseLoop jmp @__rwff_parseLoop_exit @__rwff_parseLoop_error: mov ax, 0 @__rwff_parseLoop_exit: cmp word ptr [bp - __rwff_sign], 1 jne @__rwff_skipAction neg ax @__rwff_skipAction: ; delete[] buffer ;mov bx, [bp - __rwff_FileSize] add sp, [bp - __rwff_FileSize] ; CloseFile(FileHandle) push ax mov bx, [bp - __rwff_FileHandle] mov ah, 3Eh int 21h jnc @__line_126 jmp far ptr @__rwff_Error @__line_126: pop ax jmp @__rwff_exit @__rwff_Error: add sp, __rwff__stack_offset mov ax, 0 stc jmp @__rwff_sp_skip @__rwff_exit: ;===================== ;remove local variables add sp, __rwff__stack_offset @__rwff_sp_skip: ;restore registers pop bx pop cx pop dx pop si pop bp ;add sp, __rwff__stack_par_offset ret ReadWordFromFile endp ;void PrintStr (char *str, byte color) PrintStr proc near push bp mov bp, sp ;save registers push ax push dx push bx ;===================== ; Offset's description ;=== ;arguments __ps_str = 6 ;printed string __ps_color = 4 ;color ;+++ __ps__stack_par_offset = 4 ;offset for function parameters ;===================== ; setcolor(color) ;mov ah, 0Eh ;mov al, '+' ;mov bl, 01h;[bp + __ps_color] ;int 10h mov dx, [bp + __ps_str] mov ah, 09h int 21h ;restore registers pop bx pop dx pop ax pop bp ret PrintStr endp ;word Word2ThrChr (word value, char *out) : AX Word2ThrChr proc near push bp mov bp, sp ;сохранение регистров push bx push cx push dx push si push di ;выделение локальных переменных ;============================================ ;выполнение процедуры mov ax, [bp + 6] ;value xor si, si cmp ax, 0 jge Word2ThrChr_isPositive mov bx, [bp + 4] ;*out mov byte ptr [bx + si], '-' inc si neg ax Word2ThrChr_isPositive: xor cx, cx mov bx, 3 Word2ThrChr_divLoop: xor dx, dx div bx push dx inc cx test ax, ax jnz Word2ThrChr_divLoop mov bx, [bp + 4] ;*out mov ax, 0 Word2ThrChr_movLoop: pop dx cmp si, 10 jge Word2ThrChr_skip add dl, 30h mov byte ptr [bx + si], dl inc si jmp Word2ThrChr_continue Word2ThrChr_skip: mov ax, 1 Word2ThrChr_continue: loop Word2ThrChr_movLoop ;============================================ ;удаление выделенных локальных переменных ;восстановление значений регистра pop di pop si pop dx pop cx pop bx pop bp ret Word2ThrChr endp __main: mov ax, @data mov ds, ax xor ax, ax lea ax, FileName ;FileName push ax mov ax, 0 ;Offset push ax call ReadWordFromFile add sp, 4 jnc __main_normal lea ax, msg_error ;Str push ax mov al, 00h ;Color push ax call PrintStr jmp __main_endif __main_normal: push ax ;Value lea ax, outStr ;OutStr push ax call Word2ThrChr lea ax, outStr ;Str push ax mov al, 0h ;Color call PrintStr __main_endif: mov ax, 4C00h int 21h end __main