Страница 2 из 4
Re: Обьясните плиз
Добавлено: 17 янв 2008, 18:34
somewhere
" писал(а):Но я немогу понять заечм он занес ax в es, ведь es это всего лиш дополнительный регистр и в дальнейшем он нигде неиспользуетса.
Читайте описание инструкции stos. И вообще как вы ассемблер так изучаете, если не знаете как работает инструкция?
" писал(а):Вместо Result db '' написал Result db 10 dup(?) ----- в итоге на екран нечего не выводитса всмысле он пуст.
Это мне не о чем не говорит, поскольку я не вижу весь исходный код
Re: Обьясните плиз
Добавлено: 17 янв 2008, 18:53
Apokal
Спасибо всем я понял в чем дело было. Извините что задаю иногда вопросы ответ на которые могу найти сам внимательней прочитав, просто есть пока плохая привычка все недоконца дочитывать, но я думаю вскоре избавлюсь от нее.
Re: Обьясните плиз
Добавлено: 18 янв 2008, 12:29
airyashov
потому что у вас используется строковая команда stosb
Код: Выделить всё
Команда STOSB копирует байт, расположенный в AL,
в место памяти, на которое указывает ES :D I,
а также инкрементирует или декрементирует DI
(в зависимости от состояния признака направления DF),
чтобы подготовиться к копированию AL в следующий байт памяти.
Re: Обьясните плиз
Добавлено: 22 янв 2008, 21:54
Apokal
Помогите пожалуйста в таком вопросе:
Я написал програму которая выводит на экран число которое хранитса в Number'e (число может как одно- так и многозначным).Вот код:
Код: Выделить всё
;Вывод на экран числа которое задаетса в переменной Number
.186
.model tiny
.stack 100h
.data
Number = 39
Result db 3 dup(?),'$'
.code
_start:
mov ax,@data
mov ds,ax
mov es,ax
mov di,[offset Result+2]
mov dx,offset Result
mov ax,Number
;--------------------------------------------------------
labe1:
std
mov ch,10
div ch
add ah,'0' ; Этот блок перевода одного числа в его ASCII код
xchg al,ah
stosb
;--------------------------------------------------------
cmp ah,0 ; Этот блок проверяет равно ли частное 0 если да то выводит строку на
je _Exit ; экран и завершает работу програмы
;--------------------------------------------------------
xchg al,ah
cbw ;Этот блок обменивает обратно значениями регистры al и ah и
jmp labe1 ; повторяет блок перевода одного числа в его ASCII код
;---------------------------------------------------------
_Exit:
xor ax,ax
mov ah,09h
int 21h
mov ax,4c00h ; Этот блок для вывода на экран строки и завершения програмы
int 21h
end _start
Програма работает нормально, все отлично.
Но постает несколько вопросов:
№1.
Как заранее предусмотреть размер Result'a, просто я на основе этой програмы хочу написать прогу которая читает с экрана, а потом выводит на экран число и в таком случае я незнаю какого размера будет введное чило?
№2
Командой mov di,[offset Result+2] я перемистилса в конец Result'a ( несчитая символа $).Можно ли это зделать как-то более удобным способом, учитывая что я небуду знать размер Result'a?
Re: Обьясните плиз
Добавлено: 23 янв 2008, 09:27
airyashov
Обычно в таком случае на экран выводят число по цифрам или предварительно сохранять в стеке, а так как размер числа заранее известен байт- макс 3 символа, слово 5-ь и т.д.
mov ax,Number - максимум 5 цифр в 10-ой
Re: Обьясните плиз
Добавлено: 23 янв 2008, 13:19
BBB
Apokal писал(а):Командой mov di,[offset Result+2] я перемистилса в конец Result'a ( несчитая символа $).Можно ли это зделать как-то более удобным способом, учитывая что я небуду знать размер Result'a?
Если все-таки, в таком виде, то встать на "доллар", а потом сделать шаг назад:
Код: Выделить всё
Result db 28 dup(?)
Dollar db '$'
.code
_start:
..................
mov dx, offset Dollar
dec dx
Re: Обьясните плиз
Добавлено: 23 янв 2008, 19:56
somewhere
BBB, а зачем так извращаться?
mov dx, offset Dollar - 1
Re: Обьясните плиз
Добавлено: 23 янв 2008, 21:41
Apokal
Пасиб за предыдущие ответы.
Пытаясь написать простенькую програму которая выводит на экран то, что юзер ввел столкнулса с проблемой --- прога выводит всякий мусор.
Вот код:
Код: Выделить всё
.186
.model small
.stack 100h
.data
Result db 10,9 dup(20h),'$'
.code
_start:
mov ax,@data
mov ds,ax
mov dx,offset Result
mov ah,0Ah
int 21h
mov dx,offset Result
add dx,2
mov ah,09h
int 21h
end _start
Вроде все правильно зделал, в чем может быть проблема незнаю(
Re: Обьясните плиз
Добавлено: 24 янв 2008, 09:18
airyashov
а где закончить программу? (Это про мусор)
но и исправив так программу работать будет только в частном случае, курите управляющие символы 0Dh, а так же формат буфера для функции 0Ah dos
Re: Обьясните плиз
Добавлено: 28 янв 2008, 20:44
Apokal
Помогите опять плиз!
Уже чуть углубилса в изучение ассемблера и дошол до создания файлов. Вот код проги которая создает раздел (директорию):
Код: Выделить всё
model small
.stack 100h
.386
.data
msg1 db "Enter name of directory: $"
newst db 0dh,0ah,"$"
errmsg db "Input/output error! $"
inputstrmax db 0ffh
inputstrsize db ?
inputstr db 0ffh dup (?)
.code
_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
lea dx,msg1
call printstr
call readstr
mov ah,039h
lea dx,inputstr
int 21h
jc _ioerror
jmp _wait
_ioerror:
lea dx,errmsg
call printstr
_wait:
mov ah,0
int 16h
mov ax,4c00h
int 21h
end _start
При запуске програмы начинает пищять и "матюкатса"((. Помогите плиз.