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

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

Модератор: Andy

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

17 янв 2008, 18:34

&quot писал(а):Но я немогу понять заечм он занес ax в es, ведь es это всего лиш дополнительный регистр и в дальнейшем он нигде неиспользуетса.
Читайте описание инструкции stos. И вообще как вы ассемблер так изучаете, если не знаете как работает инструкция?
&quot писал(а):Вместо Result db '' написал Result db 10 dup(?) ----- в итоге на екран нечего не выводитса всмысле он пуст.
Это мне не о чем не говорит, поскольку я не вижу весь исходный код
It's a long way to the top if you wanna rock'n'roll
Apokal
Сообщения: 79
Зарегистрирован: 14 янв 2008, 19:02

17 янв 2008, 18:53

Спасибо всем я понял в чем дело было. Извините что задаю иногда вопросы ответ на которые могу найти сам внимательней прочитав, просто есть пока плохая привычка все недоконца дочитывать, но я думаю вскоре избавлюсь от нее.
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

18 янв 2008, 12:29

потому что у вас используется строковая команда stosb

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

Команда STOSB копирует байт, расположенный в AL,
в место памяти, на которое указывает ES :D I,
а также инкрементирует или декрементирует DI
(в зависимости от состояния признака направления DF),
чтобы подготовиться к копированию AL в следующий байт памяти.
Apokal
Сообщения: 79
Зарегистрирован: 14 янв 2008, 19:02

22 янв 2008, 21:54

Помогите пожалуйста в таком вопросе:

Я написал програму которая выводит на экран число которое хранитса в 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?
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

23 янв 2008, 09:27

Обычно в таком случае на экран выводят число по цифрам или предварительно сохранять в стеке, а так как размер числа заранее известен байт- макс 3 символа, слово 5-ь и т.д.
mov ax,Number - максимум 5 цифр в 10-ой
BBB
Сообщения: 1272
Зарегистрирован: 27 дек 2005, 13:37

23 янв 2008, 13:19

Apokal писал(а):Командой mov di,[offset Result+2] я перемистилса в конец Result'a ( несчитая символа $).Можно ли это зделать как-то более удобным способом, учитывая что я небуду знать размер Result'a?
Если все-таки, в таком виде, то встать на "доллар", а потом сделать шаг назад:

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

Result db 28 dup(?)
Dollar db '$'
.code
_start:
..................
mov dx, offset Dollar
dec  dx
Аватара пользователя
somewhere
Сообщения: 1837
Зарегистрирован: 31 авг 2006, 17:14
Откуда: 71 RUS
Контактная информация:

23 янв 2008, 19:56

BBB, а зачем так извращаться?
mov dx, offset Dollar - 1
It's a long way to the top if you wanna rock'n'roll
Apokal
Сообщения: 79
Зарегистрирован: 14 янв 2008, 19:02

23 янв 2008, 21:41

Пасиб за предыдущие ответы.
Пытаясь написать простенькую програму которая выводит на экран то, что юзер ввел столкнулса с проблемой --- прога выводит всякий мусор.
Вот код:

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

.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
Вроде все правильно зделал, в чем может быть проблема незнаю(
airyashov
Сообщения: 416
Зарегистрирован: 02 ноя 2007, 10:31

24 янв 2008, 09:18

а где закончить программу? (Это про мусор)

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

mov ax,4c00h
int 21h
но и исправив так программу работать будет только в частном случае, курите управляющие символы 0Dh, а так же формат буфера для функции 0Ah dos
Apokal
Сообщения: 79
Зарегистрирован: 14 янв 2008, 19:02

28 янв 2008, 20:44

Помогите опять плиз!

Уже чуть углубилса в изучение ассемблера и дошол до создания файлов. Вот код проги которая создает раздел (директорию):

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

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
При запуске програмы начинает пищять и "матюкатса"((. Помогите плиз.
Ответить