Студентам с вопросами о лабораторных работах сюда

Тема в разделе "WASM.BEGINNERS", создана пользователем IceStudent, 11 ноя 2006.

  1. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    А ты сам не тестировал? ИМХО надо [edi + ecx*4]
    Код (Text):
    1. mov ebx, [edi]
    2. mov ecx, xxx
    3. dec ecx
    4. l1:
    5. mov eax, [edi + ecx*4]
    6. cmp ebx, eax
    7. jng l2
    8. mov ebx, eax
    9. l2:
    10. loop l1
    В ebx - максимальное число.
     
  2. Polly

    Polly New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2006
    Сообщения:
    5
    n0name

    а в [di] что лежит? у меня асм просто старый, не знаю, как он по-умному называется, но там перед регистрами нет буквы e ... там ax, bx, cx и тд.. поэтому немного сложновато воспринимать то что вы пишите.. но всё равно огромное спасибо, мне это очень могает! щас попробую скомпилировать, если получится,то обязательно напишу.

    и ещё, самое главное... вы вот пишите ххх-кол-во чисел... а как вот мне это кол-во чисел узнать через длину файла? вот это самая загвоздка-то.. =( у меня есть длина файла, числа в файле лежат примерно в таком виде:

    47 1 336 98 78
    5 37 9 128

    как узнать количество ЧИСЕЛ ?
     
  3. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    если нет "e" перед di и другими, то тогда надо писать не mov ax,[di+cx*4], а mov ax,[di+cx*2]
    в последнем куске кода в [e]di, видимо, адрес массива чисел. такого, например: n_array dd 1,3,6,8,2,5,3
     
  4. Polly

    Polly New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2006
    Сообщения:
    5
    а jng - это jg или jne или je? у нас нет такого операнда вроде... я так понимаю, jng - это "если больше"?
     
  5. n0name

    n0name New Member

    Публикаций:
    0
    Регистрация:
    5 июн 2004
    Сообщения:
    4.336
    Адрес:
    Russia
    а у нас есть :P
    jng это и есть jng. Если не больше.
    Прочитать файл. Читай файл посимвольно. Преобразовывая стринг в число.
    edi - указатель на массив чисел.
     
  6. DPX

    DPX New Member

    Публикаций:
    0
    Регистрация:
    13 фев 2005
    Сообщения:
    47
    Адрес:
    Russia
    Читаешь файл в память целиком, потом побайтно сравниваешь символы в нём с 20h (пробел) или 0dh (символ возврата каретки). Если сивол равен 20h или 0dh, то в первом случае переходишь на проверку следующего символа, во втором - на проверку символа, следующего за следующим.
    di - адрес в памяти, с которго начинается файл
    dx - количество чисел
    len - длина файла
    Код (Text):
    1. xor cx,cx
    2. dec cx
    3. begin:
    4. cmp cx,len
    5. jz ok
    6. cmp [di],20h
    7. jz space
    8. cmp [di],0dh
    9. jz carr_ret
    10. inc di
    11. inc cx
    12. jmp begin
    13. space:
    14. inc dx
    15. inc di
    16. inc cx
    17. jmp begin
    18. carr_ret:
    19. inc dx
    20. add di,2
    21. inc cx
    22. jmp begin
    23. ok:
    24. inc dx
    это, кстати, действует только если файл кончается числом, а не пробелом или 0dh. Если файл оканчивается пробелом, то инструкцию inc dx после ok надо убрать (или проверять где-либоя, является ли последний символ пробелом или символом возврата каретки)
     
  7. Fasco

    Fasco New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2006
    Сообщения:
    2
    просьба удалить пост
    проще себе моск протереть, чем дождаться ответа в этой ветке ;)
     
  8. Polly

    Polly New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2006
    Сообщения:
    5
    DPX

    то,что ты написал, - это процедура нахождения кол-ва ЧИСЕЛ, да? а в итоге в каком регистре это кол-во будет лежать?

    а, всё, поняла... в dx, да?

    извините за тупость, но НИКАК не пойму, что нужно класть в переменную [di] =( это вообще переменная или регистр? всё остальное поняла, ОГРОМНОЕ спасибо!
     
  9. TermoSINteZ

    TermoSINteZ Синоби даоса Команда форума

    Публикаций:
    2
    Регистрация:
    11 июн 2004
    Сообщения:
    3.553
    Адрес:
    Russia
    Polly
    [di] - это адрес в памяти (оперативной) . Здесь di - регистр , который указывает на смещениеб относительно начала сегмента. То есть если сегмент по умолчанию ds, то адрес будет ds: <содержимое di> :) (DS:0000, если di = 0)
    Надеюсь понятно.
    В примере же, говорится что файл будет уже открыт и адрес начала региона памяти, откуда можно считать содержимое файла указывается через связку ds:[di] (смотрите отладчик)
     
  10. CHAKA

    CHAKA New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    1
    приведите пример кода для поиска последнего пробела в строке, которую ввели на экран
     
  11. Stjena

    Stjena New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    3
    Спасите чайника!
    Нужно по введенному с клавиатуры символу выдать его ascii код в шестнадцатеричной СС!
    Заранее огромное спасибо!
     
  12. Fasco

    Fasco New Member

    Публикаций:
    0
    Регистрация:
    27 ноя 2006
    Сообщения:
    2
    Chaka:
    к примеру вот так:
    Код (Text):
    1. start:
    2.     mov eax, 020h   ;записываем в регистр eax,то что ищем ( в данном случае пробел)
    3.     mov ecx, len    ;записываем в регистр ecx длину строки (количество повторений)
    4.     lea edi,[str]   ;записываем в регистр edi адрес на начальный символ строки str
    5.     repne scasb ;перебираем побайтно строку на которую ссылается edi, сравнивая с значением регистра eax, количество повторений - регистр ecx
    6.     cmp ecx,0   ;сравниваем регистр ecx с нулем, чтобы определить когда строка закончится
    7.     jz end      ;если ecx равен нулю, выходим с цикла
    8.     mov end_space, len - ecx    ;если нет, то записываем в end_space позицию последнего найденного пробела
    9.     jmp start   ;начинаем все с начала
    10. end:
    в итоге в end_space, будет храниться номер последнего пробела в строке (может быть +-1 смещение... проверь сам, я всегда в этих вещах путаюсь)

    Stjena:
    Напиши подробней... например мы нажали клавишу 'a' (англ), в регистре al у нас теперь хранится 061h ? Надо вывести на экран текст 61h?
    Если да, то попробой комманды логического сдвига (shr, shl, сдвиг на один бит соответственно вправо и влево, бит помещается в CF). Этим способом разбиваешь по 4 бита, и сравниваешь потом с 0..9, a..f, находишь, и записываешь куда тебе надо. потом выводишь. (щас думать не хочу - пол седьмого утра...)
     
  13. Stjena

    Stjena New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    3
    Именно так!
    Я так понимаю 10h int 21h помещает в al ASCII-код символа или 0.
    Проблема с выводом!
    Я знаю только 02h int 21h,но эта ф-ция выводит символ!Замкнутый круг получается...

    Совсем я запуталась в этих вводах-выводах!Дура, я когда-то думала, что Паскаль и прочие - это сложно!
     
  14. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    Код (Text):
    1. .model tiny
    2. .code
    3. org 100h
    4. start:
    5.     xor     ah,ah
    6.     int     16h
    7.     cmp ah,1ch
    8.     je  exit
    9.  
    10.     mov     di,offset digits
    11.     xor al,al
    12.     mov     cx,4
    13.     shr     ax,cl
    14.     shr     al,cl
    15.    
    16.     xchg    ah,al
    17.     cmp     al,10
    18.     sbb     al,69h
    19.     das
    20.     stosb
    21.  
    22.     xchg    ah,al
    23.     cmp     al,10
    24.     sbb     al,69h
    25.     das
    26.     stosb
    27.  
    28.  
    29.     mov     ah,9h
    30.     mov     dx, offset dannie
    31.     int     21h
    32.     jmp start
    33.  
    34. exit:
    35. ret
    36.  
    37. dannie db 'digit is: '
    38. digits db 0h,0,0ah,0dh,'$'
    39.  
    40. end start
     
  15. Stjena

    Stjena New Member

    Публикаций:
    0
    Регистрация:
    3 дек 2006
    Сообщения:
    3
    Не получается....
    [​IMG]
    Или дело в том, что я использую tasm?
     
  16. Freeman

    Freeman New Member

    Публикаций:
    0
    Регистрация:
    10 фев 2005
    Сообщения:
    1.385
    Адрес:
    Ukraine
    код под масм
     
  17. Andys

    Andys New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    1
    Всем привет!
    Есть одна проблемка. Например есть у меня код -
    Код (Text):
    1. .MODEL small                                 
    2. .STACK 100h                          
    3. include io.asm 
    4. .data
    5. Mes1 db 'ЋиЁЎЄ !$'
    6. Mes2 db 'ЋЎкҐ¬ бў®Ў®¤­®Ј® ¬Ґбв  ­  ¤ЁбЄҐ...$'
    7.  
    8. .code
    9. main:
    10. MOV AX,0
    11. MOV BX,0
    12. MOV CX,0
    13. mov ax,@data
    14. mov ds,ax            
    15. mov ah,36h          
    16. mov dl,0   
    17. int 21h
    18.  
    19. cmp ax,255
    20. je error
    21. mov ah,9
    22. newline
    23. mov dx,offset Mes2         
    24. int 21h
    25. jmp go
    26.  
    27. error:
    28. Mov ah,9
    29. Mov dx,offset Mes1
    30. Int 21h
    31. jmp Quit
    32.  
    33. go:
    34. newline
    35. OUTWORD AX,2
    36. outch 2Eh
    37.  
    38. MOV AX,BX
    39. OUTWORD AX,2
    40. outch 2Eh
    41.  
    42. MOV AX,CX
    43. OUTWORD AX,2
    44. outch 2Eh
    45.  
    46. newline
    47. outch 20h
    48.  
    49. Quit:
    50. newline
    51. mov ax,4c00h
    52. int 21h
    53. end main
    Как на экран вывести такое значени... AX*BX*CX?
    Оно не влезет не в один регистр. Регистры серии EAX, EBX я использовать не могу.
    Так как 36h подает
    количество свободного места на HDD, в AX - число кластеров и т.п... то получается
    очень громадное число. Ага...кто-то сказал поделить все на 2048, пытался, но как это
    сделать если у меня нету EAX,EBX...а ест только AX,BX...а в AH,AL не влезает ничего больше 255(div ведь когда делаем результат попадает в регистры в 2 раза меньшего размера)
    Да если даже так делить! Постоянно возникают ошибки переполнения.
    Модель памяти FLAT также не советуйте. Помогите пожалуйста, мастера-сенсеи)
     
  18. Batman

    Batman New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    6
    Граждане! Помощь нужна! Иначе отчислят(

    1. Напишите программу в формате com, осуществляющую чтение строки с клавиатуры, меняющую регистр букв (5 бит отвечает за регистр) и выводящую изменённую строку на экран, используя упрощённые директивы сегментации
    Напоминание:
    • Чтение строки с клавиатуры можно осуществить с помощью функции 0Ah прерывания DOS Int 21h. Надо подготовить список параметров и загрузить его начальный адрес в DX перед вызовом прерывания (окончание ввода - Enter):
    MAXLEN DB 20 ; Максимальная длина
    ACTLEN DB ? ; Реальная длина
    NAMEFLD DB 20 DUP (' ') ; Введенные символы

    надо через tasm написать, никто исходничком не осчастливит, а то придется идти служить отечеству(

    P.S.: Если все-таки кто-нить откликнется, можно написать с пояснениями, а то я в асме не рулю абсолютно - всю жизнь на VB пишу, а тут разобраться никак не могу(
     
  19. tropic

    tropic New Member

    Публикаций:
    0
    Регистрация:
    7 дек 2006
    Сообщения:
    1
    Здравствуйте! Огромная просьба, если у кого-нибудь есть, выложьте программу генератора прямоугольных импульсов. Нужна для INTEL x51. Заранее спасибо.
     
  20. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Andys
    Команда
    mul BX
    умножает AX*BX и помещает результат в пару регистров DX:AX (в DX старшее слово, в AX младшее = вместе 32бита :) поэтому умножение 2х регистров всегда корректно. Ошибка может быть при умножении трёх регистров, тогда дели промежуточный результат на что нибудь :)
    div BX
    тоже делит на BX пару регистров DX:AX
    А умножать и делить на степень двух (число типа 2048) можно командами shr, shl :)