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

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

  1. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    не ну не нравятся белые, скажите черные
     
  2. Enchantner

    Enchantner New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    23
    Собственно, такая зубодробительная задачка - написать на асме чат для локальной сети. Посоветуйте, что почитать по теме? С WinAPI справлюсь, но вроде бы там простой реализации нету. Сокеты?
     
  3. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
  4. max7C4

    max7C4 New Member

    Публикаций:
    0
    Регистрация:
    17 мар 2008
    Сообщения:
    1.203
    censored+1
     
  5. Enchantner

    Enchantner New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    23
    censored, и что это такое? :) Кинь ссылку по теме
     
  6. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Enchantner
    легко
    http://social.msdn.microsoft.com/search/en-us/?query=pipe
     
  7. Enchantner

    Enchantner New Member

    Публикаций:
    0
    Регистрация:
    29 июл 2008
    Сообщения:
    23
    censored, хм, спасибо, почитаем-с...
     
  8. mitrofanzzz

    mitrofanzzz New Member

    Публикаций:
    0
    Регистрация:
    11 июл 2005
    Сообщения:
    17
    Адрес:
    Russia
    друзья я тут как-то ранее, отписывал косяк с выводом строки
    http://wasm.ru/forum/viewtopic.php?pid=297901#p297901
    кому интересно расскажу.

    str_dat db 0Ah,?,?,?,?,?,?,?,?,?,?,0Dh,0Ah,'$' - некошерно описаны умолчальные переменные...
    str_dat db 0Ah,$,$,$,$,$,$,$,$,$,$,0Dh,0Ah,'$' - кошерно описанные умолчальные переменные...

    как результат незаполненные ячейки в любом случае в вывод на экран не полезут и проблема отпала сама собой...

    Всем спосибо за внимание.
     
  9. Wild_cat

    Wild_cat New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    1
    Доброго времени суток!
    У меня такая проблема: нужно сделать лабораторную работу по "основам микропроцессорной техники". Для этого нужно разработать:
    1) все числа массива 100Н-105Н проинвентировать и скопировать в массив 106-10ВН
    2)в массив 106Н-10ВН переместить числа массива 100Н-105Н в обратной последовательности.
    1) и 2) это два разных задания, поэтому должно получиться две программы. Пожалуйста, может кто знает, подскажите, как их составить, а то я азы только начала постигать и для меня это пока еще трудное задание. Заранее спасибо за ответы!
    P.S. Микропроцессор серии К580
     
  10. Sergey777

    Sergey777 New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    12
    Как линковать файл asm в com, только практически; может кто сказать; я мало читал а, завтра сдавать!!!
     
  11. Sergey777

    Sergey777 New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    12
    Люди вот код программы

    Код (Text):
    1. ;Определяем стек
    2. STACKSG SEGMENT PARA    STACK   'Stack'
    3.         DW      100    DUP(?)  ;Задаем размер стека
    4. STACKSG ENDS
    5.  
    6. DECIMAL_SIZE EQU 5
    7.  
    8. DATA SEGMENT    ; Описание сегмента данных
    9.  MAS DW 10, 15, 20, 1, 3, 6
    10.  MIN1 DW ?
    11.  MIN2 DW ?
    12.         ;Сообщение и буфер десятичного представления числа
    13.  MESSAGE    db "Result is $"    ;Текст сообщения
    14.  NR     db 0AH,0DH,'$'      ;Текст перевода строки
    15.  RESULT     db DECIMAL_SIZE DUP('0');Буфер для перевода цифры в десятичную строку
    16. DATA ENDS
    17.  
    18.  
    19. CODE SEGMENT    ; Описание сегмента кода
    20.   ASSUME CS:CODE,DS:DATA,SS:STACKSG
    21.         ; Директива настройки сегментных регистров
    22. PRINT   PROC    near            ;Печать числа в AX на терминал
    23.                     ;Вход в процедуру
    24.     PUSH    BP          ;Сохранение старой базы автоматических
    25.                     ;переменных
    26.     MOV BP,SP           ;Установка новой базы на вершине стека
    27.     SUB SP,DECIMAL_SIZE+1   ;Выделение памяти для буфера
    28.                     ;(верхушку стека сдвигаем на размер буфера)
    29.  
    30.     MOV CX,DECIMAL_SIZE     ;Количество символов в новой строке
    31.     DEC BP          ;Перевести базу на символ ниже (BP=BP-1)
    32.     MOV [BP], BYTE PTR '$'  ;Занести в буфер символ конца строки
    33.     MOV BX,10           ;База для перевода числа в десятичное
    34.  
    35. NEXT_C: DEC BP              ;Вычисление адреса предыдущего символа
    36.     XOR DX,DX           ;Обнуление регистра DX (расширение операнда для деления)
    37.     DIV BX              ;Деление на 10 (BX=10)
    38.     ADD DL, '0'         ;Превращение остатка от деления в соответствующий символ
    39.     MOV [BP],DL         ;Запись символа в буфер
    40.     DEC CX              ;Декремент счетчика буфера
    41.     JNZ NEXT_C          ;Переход если не ноль
    42.  
    43.         MOV     AH,09                   ;выводим на экран сообщение
    44.         LEA     DX, MESSAGE         ;загрузка адреса
    45.         INT     21h                     ;вызов прерывания
    46.    
    47.         MOV     DX, BP              ;выводим на экран result
    48.     PUSH    DS          ;Сохранение в стеке значение сегментного регистра
    49.     MOV AX,SS           ;Передача нового значения DS=ES
    50.     MOV DS,AX                   ;DS:DX должен адресовать строку
    51.         MOV     AH,09                   ;
    52.         INT     21h                     ;
    53.     POP DS                      ;Востанавливаем старое значение DS
    54.     LEA DX, NR          ;Переводим строку
    55.     MOV AH,09
    56.     INT 21h
    57.                     ;Выход из процедуры
    58.     ADD SP,DECIMAL_SIZE+1   ;Освобождаем автоматическую память в стеке
    59.     POP BP          ;Востанавливаем старое значение базы
    60.                     ;автоматических переменных
    61.     RET             ;Возврат из процедуры
    62. PRINT   ENDP
    63.  
    64. BEGIN PROC FAR ; Описание процедуры BEGIN
    65.     PUSH DS ; Запись сегментного регистра DS в стек
    66.     SUB AX,AX   ; Запись нуля (нулевой адрес) в стек
    67.     PUSH AX
    68.  
    69.     MOV AX,DATA   ; Настройка сегментного регистра DS на данные
    70.     MOV DS,AX
    71.  
    72. ; Непосредственно изменяемые данные
    73.     MOV CX, 5  
    74.     LEA BX, MAS
    75.     MOV AX, [BX]
    76. SEARCH:
    77.     ADD BX, 2
    78.     CMP [BX], AX
    79.     JAE M1
    80.     MOV AX, [BX]
    81. M1:
    82.     LOOP SEARCH
    83.     MOV MIN1, AX
    84.  
    85.     MOV CX, 5  
    86.     LEA BX, MAS
    87.     MOV AX, [BX]
    88.     MOV DX, MIN1
    89. SEARCH1:
    90.     ADD BX, 2
    91.     CMP [BX], AX
    92.     JAE M2
    93.     CMP DX, [BX]
    94.     JE M2
    95.     MOV AX, [BX]
    96. M2:
    97.     LOOP SEARCH1
    98.     MOV MIN2, AX
    99.    
    100.     MOV AX, MIN1
    101.    
    102.     CALL    PRINT   ; Печать результата
    103.  
    104.     ;Далее идет аналог процедуры PRINT с буфером в зоне статических переменных
    105.     ;(результат печатается второй раз)
    106.     MOV AX, MIN2
    107.     MOV CX,10   ;Десятичная база
    108.     MOV RESULT+DECIMAL_SIZE, '$'
    109.     MOV BX,OFFSET RESULT+DECIMAL_SIZE   ; Установка базы
    110.  
    111. NEXT:   DEC BX
    112.     XOR DX,DX
    113.     DIV CX
    114.     ADD DL, '0'
    115.     MOV [BX],DL
    116.     CMP BX,OFFSET RESULT
    117.     JNE NEXT
    118.  
    119.         MOV     AH,09                   ;
    120.         LEA     DX, MESSAGE         ;выводим на экран сообщение
    121.         INT     21h                     ;
    122.         MOV     AH,09                   ;
    123.         LEA     DX, RESULT          ;выводим на экран result
    124.         INT     21h                     ;
    125.       MOV CX, SI
    126.  
    127.   RET       ; Возврат в ОС
    128.  BEGIN ENDP
    129. CODE ENDS
    130. END BEGIN
    P.S. Простите за наглость и как все таки в com линковать ЭТОООО???
     
  12. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Вопрос ЧЕМ линковать? Всё зависит от того какой ассемблер и какой линковщик и тогда выбираются его ключи. FASM и NASM вообще обходятся без линковщика. Ниже рабочие примеры для разных ассемблеров
    Код (Text):
    1. cls
    2. set filename=%1
    3. if exist %filename%.com del %filename%.com
    4. set %compiler%_path=Твой путь к папке с ассемблером
    5. rem ассемблер lzasm
    6. %lzasm_path%\bin\lzasm %filename%.asm
    7. %lzasm_path%\bin\alink %filename%.obj -oCOM -c
    8. rem ассемблер nasm
    9. %nasm_path%\bin\nasmw -f bin %filename%.asm -o %filename%.com -I%nasm_path%\include\NASM\
    10. rem ассемблер tasm
    11. %tasm_path%\bin\tasm %filename%.asm
    12. %tasm_path%\bin\tlink /t/x %filename%.obj
    13. rem ассемблер wasm
    14. %wasm_path%\bin\wasm %filename%.asm
    15. %wasm_path%\bin\wlink file %filename%.obj form dos com
    16. rem ассемблер masm
    17. %masm_path%\bin\ml /AT /c %filename%.asm
    18. %masm_path%\bin\link /T %filename%.obj,,,,,
    А по второму сообщению, судя по наличию сегмента под стек и данные
    Код (Text):
    1. STACKSG SEGMENT PARA    STACK   'Stack'
    2. ...
    3. STACKSG ENDS
    4. DATA SEGMENT    ; Описание сегмента данных
    5. ...
    6. DATA ENDS
    у тебя должен получиться не COM, а EXE! COM содержит только сегмент кода и объязательно начинается с
    ORG 100h
    Еще есть сутки, читай больше, это самое начало -- халявы НЕ БУДЕТ
     
  13. Sergey777

    Sergey777 New Member

    Публикаций:
    0
    Регистрация:
    10 мар 2009
    Сообщения:
    12
    Спасибо хоть за такое!!!
     
  14. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Здравствуйте,

    У меня вопрос по invoke.

    Я в образовательных целях написал цикл, который тупо заполняет массив из 10ти значений, затем я хочу его вывести в удобочитаемой форме, соответственно преобразую его с помощью wsprintf.

    Ниже кусок кода. Я хотел бы узнать, как можно сделать более элегантней чтоле...

    Код (Text):
    1. lpwstr      db  "%d",0
    2.  
    3. ; Buf to char
    4.         xor eax,eax    
    5.         xor ebx,ebx
    6.         mov ecx,BSIZE
    7.         mov eax,offset buf_tmp         
    8.         sxt:
    9.         mov edx,buf_d[ebx]
    10.         push eax
    11.         push ecx
    12.         invoke wsprintf,eax,ADDR lpwstr,edx
    13.         pop ecx
    14.         pop eax
    15.         add eax,4
    16.         add ebx,4
    17.         loop sxt
     
  15. censored

    censored New Member

    Публикаций:
    0
    Регистрация:
    5 июл 2005
    Сообщения:
    1.615
    Адрес:
    деревня "Анонимные Прокси"
    Noga
    MB?
    Код (Text):
    1. fmt db '%d %d %d %d %d %d %d %d %d %d', 0
    2. xor eax, eax
    3. mov ecx, 10
    4. @@cycle:
    5. push dword ptr [buf_d + eax]
    6. add eax, 4
    7. loop @@cycle
    8. push offset fmt
    9. call wsprintf
     
  16. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    censored

    Спасибо.

    С call - вариант отличный, но я хотел бы узнать как это сделать именно с помощью invoke. Собственно такой был вопрос.
     
  17. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Noga
    У wsprintf количество параметров не регламентировано, поэтому для коротких как у тебя циклов храбро делай push в цикле, а затем за пределами цикла:
    invoke wsprintf, addr buf_tmp, addr fmt
    Но wsprintf это функция в С стиле, поэтому стек от "лишних" парамеров нужно чистить самому, например так
    add esp, 10*4 ; где 10 - количество параметров, 4 размер dword
    Инвок автоматическу удалит только параметры переданные через него, здесь это addr buf_tmp и addr fmt, а в варианте censored соответсвенно забыт в конце add esp, 12*4, поскольку call за собой ничего не чистит.
     
  18. Mikl___

    Mikl___ Супермодератор Команда форума

    Публикаций:
    14
    Регистрация:
    25 июн 2008
    Сообщения:
    3.792
    Noga
    И выравнивание стека можно выполнить за один раз вынеся add esp,BSIZE*4 за пределы цикла
     
  19. Noga

    Noga New Member

    Публикаций:
    0
    Регистрация:
    10 окт 2008
    Сообщения:
    92
    Большое спасибо !

    В результате получился вот такой вот код:

    Код (Text):
    1.         ; Buf to char
    2.         xor eax,eax
    3.         mov eax,36
    4.         mov ecx,BSIZE
    5.         sxt:
    6.         push dword ptr [buf_d + eax]
    7.         sub eax,4
    8.         loop sxt       
    9.         invoke wsprintf,ADDR buf_tmp,ADDR ifmt
    10.         add esp,BSIZE*4
     
  20. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Можно ещё немного упростить
    Код (Text):
    1. mov eax,BSIZE*4
    2. sxt:push dword ptr [buf_d + eax]
    3.     sub  eax,4
    4. jnl sxt    
    5. invoke wsprintf,ADDR buf_tmp,ADDR ifmt
    6. add    esp,BSIZE*4