Считать байт по адресу и записать байт по адресу. asm под DOS

Тема в разделе "WASM.BEGINNERS", создана пользователем _mm_, 3 июн 2011.

  1. _mm_

    _mm_ New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2010
    Сообщения:
    45
    Всех приветствую!
    Помогите, пожалуйста, разобраться с регистрами, помещающимися в [] (квадратные скобки).
    В частности, как с их помощью считать байт по нужному адресу и записать его обратно.
    Помнится, на форуме были примеры с преобразованием текстового файла (увеличением кода каждого символа на 1). К сожалению, все они (по крайней мере найденные мной) под Win.
    Я попытался сделать по-простому, но у меня получается ошибка A2031 (Яндекс говорит, это "error A2031: must be index or base register").
    Вот текст:

    Код (Text):
    1. .286
    2. CSEG segment
    3. assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
    4. org 100h
    5.  
    6. begin:
    7.  
    8. mov ax,3D02h
    9. mov dx,offset File_name
    10. int 21h
    11.  
    12. mov Handle,bx
    13.  
    14. mov ah,3Fh
    15. mov dx,offset Finish
    16. mov cx,255
    17. int 21h                                            
    18.  
    19. mov Length_F,cx
    20.  
    21. cycle:                                      ;Основной цикл. В dx - адрес начала загруженного файла.
    22. mov ah,byte ptr cs:[dx]                     ;Прочтём первый байт в ah
    23. inc ah                                      ;Считанное значение в ah увеличим на 1.        
    24. mov byte ptr cs:[dx],ah                     ;Запишем обратно.                              
    25. inc dx                                      ;Перейдём к следующему байту.                  
    26. loop cycle                                  ;В cx - длина. Пока не обнулится cx - на метку.
    27.  
    28. mov ax,4200h
    29. xor dx,dx
    30. xor cx,cx
    31. int 21h
    32.  
    33. mov ah,40h
    34. mov dx,offset Finish
    35. mov cx,Length_F
    36. int 21h
    37.  
    38. mov ah,3Eh
    39. mov bx,Handle
    40. int 21h
    41.  
    42. File_name db '111.txt',0,'!$'
    43.  
    44. Handle dw 0
    45.  
    46. Length_F dw 0
    47.  
    48. Finish equ $
    49.  
    50. CSEG ends
    51. end begin
    Проблемные строки выделены комментариями. Пытался грузить и в ah и в ax, и даже другие регистры.

    Прошу ногами особо не бить :) Лучше кинуть на енто дело ссылочку.
     
  2. drmad

    drmad New Member

    Публикаций:
    0
    Регистрация:
    13 июн 2004
    Сообщения:
    332
    Адрес:
    Russia
    В 16-битном режиме ax, dx, cx не могут использоваться в качестве индекса. Только bx, si, di, bp, sp.
     
  3. _mm_

    _mm_ New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2010
    Сообщения:
    45
    Спасибо, я это читал, но и с bx и si ничего не меняется.
     
  4. pashe4ka13

    pashe4ka13 New Member

    Публикаций:
    0
    Регистрация:
    4 окт 2010
    Сообщения:
    263
    А мой старый друг _mm_ :)))
    Я бы Вам посоветовал Юрова почитать от начала до конца, хорошая книга!
    Код (Text):
    1. .286
    2. CSEG segment
    3. assume cs:CSEG, ds:CSEG, es:CSEG, ss:CSEG
    4. org 100h
    5. begin:
    6. mov ax,3D02h
    7. mov dx,offset File_name
    8. int 21h
    9. mov Handle,ax
    10. mov ah,3Fh
    11. mov dx,offset Finish
    12. mov bx,word ptr [Handle]
    13. mov cx,9
    14. int 21h                                            
    15. mov Length_F,cx
    16. mov si,dx
    17. cycle:                                     ;Основной цикл. В dx - адрес начала загруженного файла.
    18. mov ah,byte ptr cs:[si]                     ;Прочтём первый байт в ah
    19. inc ah                                     ;Считанное значение в ah увеличим на 1.        
    20. mov byte ptr cs:[si],ah                     ;Запишем обратно.                              
    21. inc si                                      ;Перейдём к следующему байту.                  
    22. loop cycle                                  ;В cx - длина. Пока не обнулится cx - на метку.
    23. mov ax,4200h
    24. xor dx,dx
    25. xor cx,cx
    26. int 21h
    27. mov ah,40h
    28. mov dx,offset Finish
    29. mov cx,Length_F
    30. int 21h
    31. mov ah,3Eh
    32. mov bx,Handle
    33. int 21h
    34. ret
    В текстовом файле 111.тхт впиши цифры 012345678, что бы увидеть как они увеличатся не единицу. Надеюсь ты это хотел увидеть ;)
     
  5. _mm_

    _mm_ New Member

    Публикаций:
    0
    Регистрация:
    28 дек 2010
    Сообщения:
    45
    Дорогой pashe4ka13!
    Огромное спасибо за помощь.
    Книжки такой пока нет, но есть весьма интересные талмуды Пильщикова, Пирогова, Голубя, Жукова с Авдюхиным (а подвиг на изучение ассемлера меня г-н Калашников). Буду изучать!