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

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

  1. taksos

    taksos New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2008
    Сообщения:
    23
    meduza, спасибо большое за ответ.
    Получается, в первом случае resd - выделяем 32 байта для дескриптора, а не 16, как я в первый раз написал?

    Если в квадратных скобках указываем, то получается, что мы запишем в регистр ebx содержимое из h_src. А если без них, то что поместится в ebx?

    p.s. Ну сообщение об ошибке лучше все равно вывести, поэтому сделал так.
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    taksos
    бита, а не байта.
    адрес h_src
    Я ничего против не имею, но
    jc err1
    jmp next1
    err1:
    то же самое, что
    jnc next1
    только короче и быстрей
     
  3. taksos

    taksos New Member

    Публикаций:
    0
    Регистрация:
    21 дек 2008
    Сообщения:
    23
    Спасибо, разобрался, что имели ввиду про структуру переходов.
     
  4. dave101ua

    dave101ua New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2009
    Сообщения:
    6
    censored,murder
    Спасибо!

    только тут:
    Код (Text):
    1. inc byte[ds:bx+txt]
    надо не txt писать а count то есть :
    Код (Text):
    1. inc byte[bx+count]
    и адресация без ds: , компилятор на него ругался, вобщем, вот что получилось:
    Код (Text):
    1. MODEL   TINY
    2. .386
    3. STACK 100h 
    4. DATASEG
    5.     txt   db 'aarakadabra' ;текст
    6.     count db 256 DUP (30h)   ;массив с количествами символов
    7.  
    8.  
    9. CODESEG    
    10. start: 
    11.     mov ax,@data
    12.     mov ds,ax
    13.  
    14.     mov cx,11               ;длина строки
    15.     mov si,offset txt
    16.     calc:lodsb
    17.          movzx bx,al
    18.          inc byte[bx+count]
    19.          mov ah, byte[bx+count]
    20.     loop calc
    21.  
    22.     mov ah,04Ch
    23.     mov al,1h
    24.     int 21h
    25.  
    26. end start
    теперь копаю в сторону как вывести букву на экран и кол-во совпадений, и так для каждой. Буду рад примеру!
     
  5. dave101ua

    dave101ua New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2009
    Сообщения:
    6
    в результате нескольких часов работы получилось вот что:
    Код (Text):
    1. MODEL   TINY
    2. .386
    3. STACK 256  
    4. DATASEG
    5.     txt   db 'abrakadabra' ;текст
    6.     count db 256 DUP (30h)          ;массив с количествами символов
    7.     i db 0
    8.     arrow db '-> '
    9.     new db 0ah, 0dh, '$'
    10.  
    11. CODESEG    
    12. start: 
    13.     mov ax,@data
    14.     mov ds,ax
    15.         mov cx,11               ;длина строки
    16.     mov si,offset txt
    17.     calc:lodsb
    18.          movzx bx,al
    19.        
    20.              dec bx; добавил эту строку, иначе неправильно считает, почему ?
    21.          inc byte[bx+count]
    22.          mov ah, byte[bx+count]
    23.          mov dl,al
    24.          mov ah,02h
    25.              int 21h   ;display letter
    26.     loop calc
    27.  
    28.     mov ah,09h
    29.     mov dx,offset new ;output new line symbol
    30.     int 21h
    31.  
    32.     mov cx,256 ;set counter
    33.     mov si,0
    34.     mov i,0
    35. show:
    36.     cmp count[si],30h ;если значение равно 0 то переходим к следующему ел-ту
    37.     je next
    38.     mov ah,02h
    39.     mov dl,i
    40.     int 21h ;output letter
    41.  
    42.     mov ah,09h
    43.     mov dx,offset arrow;display ->
    44.     int 21h
    45.  
    46.     mov ah,02h
    47.         mov dl,count[si]
    48.     int 21h
    49.  
    50.     mov ah,09h
    51.     mov dx,offset new ;display newline
    52.     int 21h
    53.  
    54.  
    55. next:
    56.     inc si
    57.     inc i
    58.  
    59.     loop show
    60.  
    61.     mov ah,04Ch
    62.     mov al,1h
    63.     int 21h
    64.  
    65. end start
    вопрос:
    задал я строку abrakadabra
    и взял пример кода который дал murder, в результате посчитало что символ b встречается 5 раз в строке, а правильно: символ а встречается 5 раз, то есть подсчет получился со смещением на +1 (и так для каждого симвлоа), пофиксилось это добавлением dec bx; после операции movzx,
    непонятно почему это происходит ?
     
  6. morkster

    morkster New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    31
    а если заменить count[si] на byte [count+si]?
    в самом подсчете ошибок вроде нету, ошибка наверное в выводе
    подумалось, может комплексатор считает что count[1] указывает на первый символ, а не count[0]
    до буквы а резултатов никаких не выкидывает? вроде должен тогда напечатать " -> a"
     
  7. dave101ua

    dave101ua New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2009
    Сообщения:
    6
    morkster
    в данный момент результат выглядит так:
    a->
    5
    b->
    2
    d->
    1
    k->
    1
    r->
    2

    если сделать замену(поставить mov dl,byte [count+si]) и закомментировать dec bx то результат выглядит так:
    b->
    2
    c->
    0
    e->
    0
    l->
    0
    s->
    0


    если dec bx раскомментировать то:
    a->
    2
    b->
    0
    d->
    0
    k->
    0
    r->
    0

    непонятно...
     
  8. morkster

    morkster New Member

    Публикаций:
    0
    Регистрация:
    12 окт 2005
    Сообщения:
    31
    раз лишних строчек нету, то теоретиков как я надо душить..
    под tasmom работает как надо если в
    Код (Text):
    1. inc byte[bx+count]
    2. mov ah, byte[bx+count] ;this line is not used btw
    заменить byte на byte ptr, или выдерживая стиль, на count[bx]
    не уверен что комплексатор делает с byte, но нам того и не надо
     
  9. dave101ua

    dave101ua New Member

    Публикаций:
    0
    Регистрация:
    5 янв 2009
    Сообщения:
    6
    вобщем то, сейчас это не так важно, главное что работает :)
    я изменил прогу, теперь строку можно вводить с клавиатуры, все считает, но есть проблема:
    если символ встречается более 9 раз в строке то когда вывожу на экран, вместо числа (кол-во сколько раз символ встречается) выводится какой то левый символ, делаю так:

    Код (Text):
    1.     mov ah,02h
    2.         mov dl,count[si]
    3.     int 21h
    то есть если в count[si] число более 9 то вывод неверный. получается цифры нормально выводит а число не хочет. Как правильно решить это ?
    преобразовывать число в строку а потом выводить с помощью 09h ? Если да, то как правильно преобразовывать ?
    вот весь код программы на всякий случай, делаю под тасм
    Код (Text):
    1. .MODEL  TINY
    2. .386
    3. STACK 256  
    4. DATASEG
    5. ; symbols 13 and 32, carriage return and space symbol, start count from 0
    6. ;msg db 0ah, 0dh, 'Enter string: $'
    7. msg db 'Enter string:$'
    8. ;string db 254,0
    9. ;times 253 db dup(' ') ;заполняем буфер строки пробелами
    10. string db 256 DUP ('#')
    11. count db 256 DUP ('0')          ;массив с количествами символов
    12. ;string db 255,0, 256 dup (' ')
    13. new db 0ah, 0dh, '$'
    14. i db 0
    15. arrow db '->$'
    16.  
    17.  
    18. CODESEG    
    19. start: 
    20.     mov ax,@data
    21.     mov ds,ax
    22.     mov ah,09h
    23.     mov dx,offset msg
    24.     int 21h
    25.  
    26.     mov ah, 0Ah
    27.     mov dx,offset string
    28.     int 21h
    29.  
    30.     xor ax,ax
    31.     mov al,offset string+1
    32.     inc dx
    33.     add dx, ax
    34.     mov si,dx
    35.    
    36.  
    37.     mov ah,09h
    38.     mov dx,offset new ;output new line symbol
    39.     int 21h
    40.  
    41.  
    42.     std ;устанавливаем флаг направления дляпрохода обратно
    43.     print_next_char:
    44.     lodsb ;читаем символ из DS:SI и уменьшаем SI на 1
    45.  
    46.     cmp si,offset string+1 ;конец строки? (то есть начало)
    47.     jb endprog ; если да, то переход к концу программы
    48.  
    49.  
    50.          cmp al,0dh
    51.          je skip
    52.          cmp al,023h
    53.          je skip
    54.  
    55.          movzx bx,al
    56.              dec bx
    57.          
    58.          inc byte[bx+count]
    59. skip:
    60.     mov dl, al ;загружаем прочитанный из строки символ в DL
    61.     mov ah,02h ;DOS-функция вывода символа
    62. ;   int 21h ;вызов DOS
    63.     jmp print_next_char ;возвращаемся к следующему символу
    64. endprog:
    65.         mov dx,offset new
    66.     mov ah,09h
    67.     int 21h
    68.  
    69.  
    70.         mov dx,offset count
    71.     mov ah,09h
    72.     ;int 21h ;displays count array
    73.  
    74. ;my data block  
    75.  
    76.  
    77.     mov cx,256 ;set counter
    78.     mov si,0
    79.     mov i,0
    80. show:
    81.     cmp count[si],30h
    82.     je next
    83.  
    84.     mov ah,02h
    85.     mov dl,i
    86.     int 21h ;output letter
    87.  
    88.  
    89.    
    90.     mov ah,09h
    91.     mov dx,offset arrow;display ->
    92.     int 21h
    93.  
    94.  
    95.     mov ah,02h
    96.         mov dl,count[si]
    97. ;   mov ah,09h
    98. ;        mov dx,count[si]
    99.  
    100.     int 21h
    101.  
    102.     mov ah,09h
    103.     mov dx,offset new ;display newline
    104.     int 21h
    105.  
    106.  
    107. next:
    108.     inc si
    109.     inc i
    110.  
    111.     loop show
    112.  
    113.  
    114. ;end my data block
    115.     mov ah,04Ch
    116.     mov al,1h
    117.     int 21h
    118.  
    119. end start
     
  10. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Не тупи число больше 9 в десятичной системе - это более 1 байта. Вот рабочий код на FASM`е для 2-значных чисел.
    Код (Text):
    1.      
    2. org 100h
    3. mov  al,3
    4. int  10h
    5. mov  cx,11
    6. mov  si,txt
    7. push 0B800h
    8. pop  es
    9. xor  di,di
    10. calc:lodsb
    11.      movzx bx,al
    12.      inc   byte[ds:bx+count]
    13.      stosb
    14.      inc   di
    15. loop calc
    16.  
    17. mov cx,256
    18. std
    19. push ds
    20. push es
    21. pop  ds
    22. pop  es
    23. add  di,160-11*2
    24. mov  si,di
    25. mov  di,count+255
    26. show:xor  al,al
    27.      repe scasb
    28.      je   quit
    29.      mov  [ds:si],cl
    30.      mov  byte[ds:si+2],'-'
    31.      mov  al,[es:di+1]
    32.      aam                          
    33.      add  ax,3030h
    34.      mov  [ds:si+4],ah
    35.      mov  [ds:si+6],al
    36.      add  si,160
    37. jmp show
    38. quit:
    39. int 16h
    40. ret
    41. txt   db 'abrakadabra',0
    42. count db 256 dup(0)
    Перевод числа в строку
     
  11. RadASM

    RadASM New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    12
    Помогите исправить. Вот задание:
    Оранжевый цвет в итоге разрешили не делать (запара с градациями). Остаётся разобратся по части курсора, и как это дело правильно откомпилировать (пытаюсь в emu8086 только текстовую часть без курсора - строка сдинута и притом не вся, при эмуляции вся впорядке).
    Код (Text):
    1. ;Каждый — Красный (4)
    2. MOV BL,4    ;цвет
    3. MOV CX,6    ;колво символов
    4. MOV BP,OFFSET msg ;считываем адрес начала строки
    5. MOV AH,13h  ; записать строку
    6. INT 10h
    7. ;Охотник — Оранжевый (?)
    8. MOV DX,7    ;координаты, с которых начинается запись строки
    9. MOV BL,12
    10. MOV CX,7
    11. MOV BP,OFFSET msg1
    12. INT 10h
    13. ;Желает — Жёлтый (14)
    14. MOV DX,15
    15. MOV BL,14
    16. MOV CX,6
    17. MOV BP,OFFSET msg2
    18. INT 10h
    19. ;Знать — Зелёный (2)
    20. MOV DX,22
    21. MOV BL,2
    22. MOV CX,6
    23. MOV BP,OFFSET msg3
    24. INT 10h
    25. ;Где — Голубой (9)
    26. MOV DX,29
    27. MOV BL,9
    28. MOV CX,3
    29. MOV BP,OFFSET msg4
    30. INT 10h
    31. ;Сидит — Синий (1)
    32. MOV DX,33
    33. MOV BL,1
    34. MOV CX,5
    35. MOV BP,OFFSET msg5
    36. INT 10h
    37. ;Фазан — Фиолетовый (5)
    38. MOV DX,39
    39. MOV BL,5
    40. MOV CX,6
    41. MOV BP,OFFSET msg6
    42. INT 10h
    43.  
    44. ;КУРСОР (гдето здесь неладное)
    45. m1:
    46. MOV AX,01H      ;включить курсор
    47. INT 33H
    48. MOV AH,08H      ;прочитать атрибут с позиции курсора (AH = атрибут)
    49. INT 10H
    50. MOV BL,AL
    51. ADD BL,18       ;фон
    52. MOV CX,1
    53. MOV AH,09H      ;записать символ и атрибут в позиции курсора (BL = атрибут)
    54. INT 10H
    55. MOV AX,02H      ;включить курсор
    56. INT 33H
    57. JMP m1
    58.  
    59. msg DB 138,160,166,164,235,169,00           ;Каждый
    60. msg1 DB 174,229,174,226,173,168,170,00      ;охотник
    61. msg2 DB 166,165,171,160,165,226,00          ;желает
    62. msg3 DB 167,173,160,226,236,44,00           ;знать
    63. msg4 DB 163,164,165,00                      ;где,
    64. msg5 DB 225,168,164,168,226,00              ;сидит
    65. msg6 DB 228,160,167,160,173,46              ;фазан
    фон курсор меняет только в одном символе почемуто!?
     
  12. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Курсор (инверсия фона)
    Код (Text):
    1. org 100h
    2. mov ax,3
    3. int 10h
    4. push 0B800h
    5. pop  es
    6. m1:
    7. mov  ax,3
    8. int  33h
    9. shl  dx,2
    10. shr  cx,2
    11. lea  ebx,[edx*4+edx]
    12. add  ebx,ecx
    13. cmp  bx,di
    14. sete al
    15. dec  al
    16. xor  [es:di+1],al
    17. xor  [es:bx+1],al
    18. mov  di,bx
    19. jmp m1
    20. ret
     
  13. RadASM

    RadASM New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    12
    EBX,EDX,ECX - в моей ситуации их нет 8086
    sete - тоже
     
  14. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Код (Text):
    1. org 100h
    2. mov ax,3
    3. int 10h
    4. push 0B800h
    5. pop  es
    6. m1:
    7. mov  ax,3
    8. int  33h
    9. imul dx,dx,20
    10. shr  cx,2
    11. add  dx,cx
    12. cmp  dx,di
    13. je m1
    14. not  byte[es:di+1]
    15. mov  di,dx
    16. not  byte[es:di+1]
    17. jmp m1
    18. ret
     
  15. RadASM

    RadASM New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    12
    IMUL DX,DX,20 - токой команды непонимаю ни я ни эмулятор
    если просто IMUL DX - то результат неочень
     
  16. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    Замени на
    Код (Text):
    1. mov  ax,dx
    2. shl  dx,4
    3. shl  ax,2
    4. add  dx,ax
     
  17. RadASM

    RadASM New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    12
    В итоге фон меняется только в одной позиции, а текст исчезает
     
  18. RadASM

    RadASM New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    12
    murder
    с твоей помощью код сейчас выглядит так:
    Код (Text):
    1. ;Каждый — Красный (4)
    2. MOV BL,4    ;цвет
    3. MOV CX,6    ;колво символов
    4. MOV BP,OFFSET msg ;считываем адрес начала строки
    5. MOV AL,1    ; ДОБАВИЛ
    6. MOV AH,13h  ; записать строку
    7. INT 10h
    8. ;Охотник — Оранжевый (?)
    9. MOV DX,7    ;координаты, с которых начинается запись строки
    10. MOV BL,12
    11. MOV CX,7
    12. MOV BP,OFFSET msg1
    13. INT 10h
    14. ;Желает — Жёлтый (14)
    15. MOV DX,15
    16. MOV BL,14
    17. MOV CX,6
    18. MOV BP,OFFSET msg2
    19. INT 10h
    20. ;Знать — Зелёный (2)
    21. MOV DX,22
    22. MOV BL,2
    23. MOV CX,6
    24. MOV BP,OFFSET msg3
    25. INT 10h
    26. ;Где — Голубой (9)
    27. MOV DX,29
    28. MOV BL,9
    29. MOV CX,3
    30. MOV BP,OFFSET msg4
    31. INT 10h
    32. ;Сидит — Синий (1)
    33. MOV DX,33
    34. MOV BL,1
    35. MOV CX,5
    36. MOV BP,OFFSET msg5
    37. INT 10h
    38. ;Фазан — Фиолетовый (5)
    39. MOV DX,39
    40. MOV BL,5
    41. MOV CX,6
    42. MOV BP,OFFSET msg6
    43. INT 10h
    44.  
    45. ;КУРСОР (гдето здесь неладное)
    46. MOV AX,01H      ;включить курсор
    47. INT 33H
    48. MOV AX,3
    49. INT 10h
    50. PUSH 0B800h
    51. POP  ES
    52. m1:
    53. MOV  AX,3
    54. INT  33h
    55. MOV  AX,DX
    56. SHL  DX,4
    57. SHL  AX,2
    58. ADD  DX,AX
    59. SHR  CX,2
    60. ADD  DX,CX
    61. CMP  DX,DI
    62. JE m1
    63. NOT  byte[ES:DI+1]
    64. MOV  DI,DX
    65. NOT  byte[ES:DI+1]
    66. JMP m1
    67. RET
    68.  
    69. msg DB 138,160,166,164,235,169,00           ;Каждый
    70. msg1 DB 174,229,174,226,173,168,170,00      ;охотник
    71. msg2 DB 166,165,171,160,165,226,00          ;желает
    72. msg3 DB 167,173,160,226,236,44,00           ;знать
    73. msg4 DB 163,164,165,00                      ;где,
    74. msg5 DB 225,168,164,168,226,00              ;сидит
    75. msg6 DB 228,160,167,160,173,46              ;фазан
    правда результат неочень, есть подозрения что дело в не в курсоре а в выводе строки INT 10h / AH = 13h (так как тоже влияет на курсор)
    но пока нипанятна
     
  19. murder

    murder Member

    Публикаций:
    0
    Регистрация:
    3 июн 2007
    Сообщения:
    628
    @@: - анонимная метка
    @f: - следующая анонимная метка
    @b: - предыдущая анонимная метка
    Код (Text):
    1. org 100h
    2. mov ax,3
    3. int 10h
    4. push 0B800h
    5. pop  es
    6. xor  di,di
    7. mov  si,text
    8. mov  cx,43
    9. rep  movsw
    10. mov  dx,4002 ;начальная позиция курсора
    11. mov  byte[es:4002],255
    12. xor  bx,bx
    13. m1:mov   di,dx
    14.    mov    ax,3
    15.    int    33h
    16.    mov    ax,dx
    17.    shl    dx,4
    18.    shl    ax,2
    19.    add    dx,ax
    20.    shr    cx,2
    21.    add    dx,cx
    22.    inc    dx
    23.    cmp    dx,di
    24.    je m1
    25.    mov    bl,byte[es:di] ;стираем устаревшую подсветку
    26.    not    bl
    27.    shl    bx,2
    28.    mov    cx,[words+bx+2]
    29.    cmp    [words+bx],0
    30.    je @f
    31.    mov    di,[words+bx]
    32.    @@:not byte[es:di]
    33.       add di,2
    34.    loop @b
    35.    mov    di,dx ;рисуем новую подсветку
    36.    mov    bl,byte[es:di]
    37.    shl    bx,2
    38.    mov    cx,[words+bx+2]
    39.    cmp    [words+bx],0
    40.    je @f
    41.    mov    di,[words+bx]
    42.    @@:not byte[es:di]
    43.       add di,2
    44.    loop @b
    45. jmp m1
    46. ret
    47. text db 'К',4,'а',4,'ж',4,'д',4,'ы',4,'й',4,' ',0,'о',12,'х',12,'о',12,'т',12,'н',12,'и',12,'к',12,' ',0,\
    48.         'ж',6,'е',6,'л',6,'а',6,'е',6,'т',6,' ',0,'з',2,'н',2,'а',2,'т',2,'ь',2,' ',0,\
    49.         'г',3,'д',3,'е',3,' ',0,'с',1,'и',1,'д',1,'и',1,'т',1,' ',0,'ф',5,'а',5,'з',5,'а',5,'н',5
    50. words dw  0,1,\
    51.          65,5,\  ;сидит
    52.          45,5,\  ;знать
    53.          57,3,\  ;где
    54.           1,6,\  ;каждый
    55.          77,5,\  ;фазан
    56.          31,6,\  ;желает
    57.           0,1,\
    58.           0,1,\
    59.           0,1,\
    60.           0,1,\
    61.           0,1,\
    62.          15,7    ;охотник
    Пиши в FASM
     
  20. RadASM

    RadASM New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2008
    Сообщения:
    12
    murder это готовый для компиляции код или нужно ещё чтото добавить
    компильнул в FASM`е в том виде что ты дал результат не радует - текст кракозяблит, курсора вобще нет (тока курсивчик мигает)