Обьясните плиз
Модератор: Andy
программа начинается с метки _start, там же находится процедура printstr, а вот что находиться в тот момент в DX - никому не известно.
It's a long way to the top if you wanna rock'n'roll
точка входа мимо, попадаете сразу в процедуру в DX непонятно что, а потом по возврату ret
Спасибо за ответы! Я понял в чем дело было. Я просто потом добавил переход на метку которая находитса уже за описаваемими процедурами. При дальнейшей работе с файлами у мен возник интересный вопрос. Вот код програмы которая создает директорию, переходит в нее, там создает новый файл. Но вопрос в том почему файл создаетса только в той папке которая была создана в папке с тасмом, еслия например создам папку просто на диске С то в той папке файл несоздадитса
Обьясните плиз почему так? 


Код: Выделить всё
model small
.386
.stack 100h
.data
msg1 db "Enter name of directory: $"
msg2 db "Directory created successful!",0dh,0ah,"$"
msg3 db "Enter name of file: $"
msg4 db "File created successful!",0dh,0ah,"$"
filehandle dw ?
newst db 0dh,0ah,"$"
errmsg db "Input/output error! $"
inputstrmax db 0ffh
inputstrsize db ?
inputstr db 0ffh dup (?)
.code
_start:
mov ax,@data
mov ds,ax
jmp _real_start
printstr proc
mov ah,09h
int 21h
ret
printstr endp
readstr proc
lea dx,inputstrmax
mov ah,0ah
int 21h
movzx cx,inputstrsize
lea bx,inputstr
add bx,cx
mov byte ptr [bx],0
ret
readstr endp
_real_start:
;-----------------------------Creating a new directory-------------------------
lea dx,msg1
call printstr
call readstr
mov ah,039h
lea dx,inputstr
int 21h
jc _ioerror
lea dx,newst
call printstr
lea dx,msg2
call printstr
;----------------------------Entering a new directory-------------------------------
mov ah,03bh
lea dx,inputstr
int 21h
jc _ioerror
;----------------------------Creating a new file with it's opening------------------
lea dx,msg3
call printstr
call readstr
mov ah,03ch
xor cx,cx
lea dx,inputstr
int 21h
jc _ioerror
lea dx,newst
call printstr
lea dx,msg4
call printstr
mov filehandle,ax
;---------------------------Closing a new file----------------------------------------
mov ah,03eh
mov bx,filehandle
int 21h
jmp _wait
_ioerror:
lea dx,newst
call printstr
lea dx,errmsg
call printstr
_wait:
mov ah,0
int 16h
mov ax,4c00h
int 21h
end _start
Функция 3Bh - аналог команды ДОС ChDir или CD
Даже если в параметрах функции четко указан диск, который отличается от текщего, то текущий диск не меняется и переход в заданную директорию не выполняется.
Перед тем, как сменить текущую директорию - смените текущий диск на тот, который нужен.
А вообще использование смены текущего диска и папки для создания файла по заданному пути - дурной тон, т.к. всегда можно создать файл указав полный путь, не травмируя психику пользователя которому надо будет еще обратно идти. Туда, откуда его перекинули текущую папку
Даже если в параметрах функции четко указан диск, который отличается от текщего, то текущий диск не меняется и переход в заданную директорию не выполняется.
Перед тем, как сменить текущую директорию - смените текущий диск на тот, который нужен.
А вообще использование смены текущего диска и папки для создания файла по заданному пути - дурной тон, т.к. всегда можно создать файл указав полный путь, не травмируя психику пользователя которому надо будет еще обратно идти. Туда, откуда его перекинули текущую папку
It's a long way to the top if you wanna rock'n'roll
Опять возник трабл(( Добавил к предыдущему коду строчки которые осуществляют запись в файл строки символов. При работе проги все ок, даже контрольный меседж нащет успешной записи в файл строчки появляетса, но самой строчкив файле нет!!!!!!!!
Я незнаю в чем проблема --- может нада какието символы контрольные в конец записываемой строчки дописать? Хотя я читал описание 40-й функции 21-го прерывания и там нечего подобного несказано.
Вот код:
Я незнаю в чем проблема --- может нада какието символы контрольные в конец записываемой строчки дописать? Хотя я читал описание 40-й функции 21-го прерывания и там нечего подобного несказано.
Вот код:
Код: Выделить всё
.model small
.386
.stack 100h
.data
msg1 db "Enter name of directory: $"
msg2 db "Directory created successful!",0dh,0ah,"$"
msg3 db "Enter name of file: $"
msg4 db "File created successful!",0dh,0ah,"$"
msg5 db "Enter a string: $"
msg6 db "Writing to file is succsessful!",0dh,0ah,"$"
msg7 dw 2 dup (?),"$"
filehandle dw ?
newst db 0dh,0ah,"$"
errmsg db "Input/output error! $"
inputstrmax db 0ffh
inputstrsize db ?
inputstr db 0ffh dup (?)
.code
_start:
mov ax,@data
mov ds,ax
mov es,ax
jmp _real_start
printstr proc
mov ah,09h
int 21h
ret
printstr endp
readstr proc
lea dx,inputstrmax
mov ah,0ah
int 21h
movzx cx,inputstrsize
lea bx,inputstr
add bx,cx
mov byte ptr [bx],0
ret
readstr endp
_real_start:
;-----------------------------Creating a new directory-------------------------
lea dx,msg1
call printstr
call readstr
mov ah,039h
lea dx,inputstr
int 21h
jc _ioerror
lea dx,newst
call printstr
lea dx,msg2
call printstr
;----------------------------Entering a new directory-------------------------------
mov ah,03bh
lea dx,inputstr
int 21h
jc _ioerror
;----------------------------Creating a new file with it's opening------------------
lea dx,msg3
call printstr
call readstr
mov ah,03ch
xor cx,cx
lea dx,inputstr
int 21h
jc _ioerror
lea dx,newst
call printstr
lea dx,msg4
call printstr
mov filehandle,ax
;---------------------------Writing data to file-------------------------------------
lea dx,msg5
call printstr
call readstr
mov ah,40h
mov bx,filehandle
movzx cx,inputstrsize
jc _ioerror
lea dx,newst
call printstr
lea dx,msg6
call printstr
;---------------------------Closing a new file----------------------------------------
mov ah,03eh
mov bx,filehandle
int 21h
jmp _wait
_ioerror:
lea dx,newst
call printstr
lea dx,errmsg
call printstr
_wait:
mov ah,0
int 16h
mov ax,4c00h
int 21h
end _start
Помогите с траблом! Добавил к предыдущему коду строчки которые осущетчвляют запись в файл, но как всегда сторчка туда записыватса нехочет. Скажыте плиз в чем ошыбка!
Код: Выделить всё
.model small
.386
.stack 100h
.data
msg1 db "Enter name of directory: $"
msg2 db "Directory created successful!",0dh,0ah,"$"
msg3 db "Enter name of file: $"
msg4 db "File created successful!",0dh,0ah,"$"
msg5 db "Enter a string: $"
msg6 db "Writing to file is succsessful!",0dh,0ah,"$"
msg7 dw 2 dup (?),"$"
filehandle dw ?
newst db 0dh,0ah,"$"
errmsg db "Input/output error! $"
inputstrmax db 0ffh
inputstrsize db ?
inputstr db 0ffh dup (?)
.code
_start:
mov ax,@data
mov ds,ax
mov es,ax
jmp _real_start
printstr proc
mov ah,09h
int 21h
ret
printstr endp
readstr proc
lea dx,inputstrmax
mov ah,0ah
int 21h
movzx cx,inputstrsize
lea bx,inputstr
add bx,cx
mov byte ptr [bx],0
ret
readstr endp
_real_start:
;-----------------------------Creating a new directory-------------------------
lea dx,msg1
call printstr
call readstr
mov ah,039h
lea dx,inputstr
int 21h
jc _ioerror
lea dx,newst
call printstr
lea dx,msg2
call printstr
;----------------------------Entering a new directory-------------------------------
mov ah,03bh
lea dx,inputstr
int 21h
jc _ioerror
;----------------------------Creating a new file with it's opening------------------
lea dx,msg3
call printstr
call readstr
mov ah,03ch
xor cx,cx
lea dx,inputstr
int 21h
jc _ioerror
lea dx,newst
call printstr
lea dx,msg4
call printstr
mov filehandle,ax
;---------------------------Writing data to file-------------------------------------
lea dx,msg5
call printstr
call readstr
movzx cx,inputstrsize
lea di,inputstr
add di,cx
mov byte ptr [di],"$"
mov ah,40h
mov bx,filehandle
int 21h
jc _ioerror
lea dx,newst
call printstr
lea dx,msg6
call printstr
;---------------------------Closing a new file----------------------------------------
mov ah,03eh
mov bx,filehandle
int 21h
jmp _wait
_ioerror:
lea dx,newst
call printstr
lea dx,errmsg
call printstr
_wait:
mov ah,0
int 16h
mov ax,4c00h
int 21h
end _start
Нужна ваша помощь.
Необходимо написать програму на ассемблере, которая показывала бы пинг аналогично до того как в командной строке когда пишем ping server adress.
Юзер вводит адрес серва а прога выводит пинг.
Подскажыте с алгоритмом решения, бо я в этом нешарю. Заранее спс.
Необходимо написать програму на ассемблере, которая показывала бы пинг аналогично до того как в командной строке когда пишем ping server adress.
Юзер вводит адрес серва а прога выводит пинг.
Подскажыте с алгоритмом решения, бо я в этом нешарю. Заранее спс.
Под винду небось хотите или под ДОС?
Под винду. Мне ненадо особой сложности -- бо мне будет трудно в реализации алгоритма на асме, так как ассемблер я на уровне нюба пока знаю.
А какой тут может быть алгоритм, вся реализация-то через WinAPI идет. Просто тупо череда Call с параметрами через стек - вот вам и весь алгоритм.
It's a long way to the top if you wanna rock'n'roll