Обьясните плиз

Низкоуровневое программирование портов, микроконтроллеров и т.д.

Модератор: Andy

Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

28 янв 2008, 23:38

программа начинается с метки _start, там же находится процедура printstr, а вот что находиться в тот момент в DX - никому не известно.
It's a long way to the top if you wanna rock'n'roll
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

29 янв 2008, 08:47

точка входа мимо, попадаете сразу в процедуру в DX непонятно что, а потом по возврату ret
Apokal
Сообщения: 79
Зарегистрирован: 14 янв 2008, 19:02

30 янв 2008, 21:46

Спасибо за ответы! Я понял в чем дело было. Я просто потом добавил переход на метку которая находитса уже за описаваемими процедурами. При дальнейшей работе с файлами у мен возник интересный вопрос. Вот код програмы которая создает директорию, переходит в нее, там создает новый файл. Но вопрос в том почему файл создаетса только в той папке которая была создана в папке с тасмом, еслия например создам папку просто на диске С то в той папке файл несоздадитса :D Обьясните плиз почему так? :confused:

Код: Выделить всё

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
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

30 янв 2008, 23:03

Функция 3Bh - аналог команды ДОС ChDir или CD
Даже если в параметрах функции четко указан диск, который отличается от текщего, то текущий диск не меняется и переход в заданную директорию не выполняется.
Перед тем, как сменить текущую директорию - смените текущий диск на тот, который нужен.
А вообще использование смены текущего диска и папки для создания файла по заданному пути - дурной тон, т.к. всегда можно создать файл указав полный путь, не травмируя психику пользователя которому надо будет еще обратно идти. Туда, откуда его перекинули текущую папку
It's a long way to the top if you wanna rock'n'roll
Apokal
Сообщения: 79
Зарегистрирован: 14 янв 2008, 19:02

05 фев 2008, 20:51

Опять возник трабл(( Добавил к предыдущему коду строчки которые осуществляют запись в файл строки символов. При работе проги все ок, даже контрольный меседж нащет успешной записи в файл строчки появляетса, но самой строчкив файле нет!!!!!!!!
Я незнаю в чем проблема --- может нада какието символы контрольные в конец записываемой строчки дописать? Хотя я читал описание 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
Apokal
Сообщения: 79
Зарегистрирован: 14 янв 2008, 19:02

05 фев 2008, 21:13

Помогите с траблом! Добавил к предыдущему коду строчки которые осущетчвляют запись в файл, но как всегда сторчка туда записыватса нехочет. Скажыте плиз в чем ошыбка!

Код: Выделить всё

.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
Apokal
Сообщения: 79
Зарегистрирован: 14 янв 2008, 19:02

08 мар 2008, 12:23

Нужна ваша помощь.

Необходимо написать програму на ассемблере, которая показывала бы пинг аналогично до того как в командной строке когда пишем ping server adress.
Юзер вводит адрес серва а прога выводит пинг.
Подскажыте с алгоритмом решения, бо я в этом нешарю. Заранее спс.
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

10 мар 2008, 00:49

Под винду небось хотите или под ДОС?
Apokal
Сообщения: 79
Зарегистрирован: 14 янв 2008, 19:02

10 мар 2008, 12:28

Под винду. Мне ненадо особой сложности -- бо мне будет трудно в реализации алгоритма на асме, так как ассемблер я на уровне нюба пока знаю.
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

10 мар 2008, 13:36

А какой тут может быть алгоритм, вся реализация-то через WinAPI идет. Просто тупо череда Call с параметрами через стек - вот вам и весь алгоритм.
It's a long way to the top if you wanna rock'n'roll
Ответить