singlepost

Всеми любимый ассемблер << На главную или назад  

Всех с Новым Годом! Пытаюсь сделать программу, считающую сумму элементов массива и записывающую ее в файл, выдает ошибки вот в этих строках:
a:lea ESI, array

mov dx, offset file1

mov dx, offset sum

Сам листинг:

code segment
assume cs:code, ds:data
.386
begin:
mov ax, data
mov ds, ax

mov ecx, size2
a:lea ESI, array
mov ax, word ptr[ESI]
add word ptr sum, ax
mov ax, word ptr[ESI+2]
adc word ptr sum 2, ax
add ESI, 4
loop a

mov ah, 3dh
mov al, 1
mov dx, offset file1
int 21h

mov cx, ax

mov ah, 40h
mov bx, cx
mov cx, 2
mov dx, offset sum
int 21h

mov ah, 4ch
mov al, 0
int 21h
code ends

data segment
array dd 0, 1, 2, 3, 3
size2 equ ($-array)/4
sum dd 0
file1 db 'a.txt', 0
data ends

stk segment stack
db 256 dup(0)
stk ends

Прошу помочь

61 ответов в теме “Всеми любимый ассемблер”

  1. 12
    Егор Решецкий ответил:

    Не, не помогает

  2. 11
    Deleted Deleted ответил:

    Может стоит попробовать после lea esi, array меточку поставить?

  3. 10
    Deleted Deleted ответил:

    Т.е.

    lea esi, array
    a:

    ?

  4. 9
    Егор Решецкий ответил:

    Антон Щиров

    Имеете в виду инициальзацию ss? Как она производится?

  5. 8
    Антон Щиров ответил:

    #2

  6. 7
    Егор Решецкий ответил:

    Спасибо за помощь

    Подправил регистр на edx и во втором случае-осталась одна ошибка, в строке сразу за меткой "а". Есть у кого идеи из-за чего?

  7. 6
    Антон Щиров ответил:

    > 1) Смысл вообще звучит как вроде "настройка регистра ds", и выполняется уже как ритуал
    //ru.wikipedia.org/wiki/Культ_карго

    > Исправил по первой ошибке
    Дальше мне сказать нечего

  8. 5
    Егор Решецкий ответил:

    1) Смысл вообще звучит как вроде "настройка регистра ds", и выполняется уже как ритуал
    2)Объясните про инициализацию, а лучше напишите как она выглядит, я не в курсе о таком=(

    Исправил по первой ошибке (offset sum), подправил сегмент стека…и…о чудо, теперь общее количестиво ошибок уже только две!

  9. 4
    Антон Щиров ответил:

    >error A2057: Illegal size for operand
    Вы пишете
    > .386
    Этим вы говорите, что используете набор команд процессора 80386
    > mov dx, offset sum
    Этой строкой вы говорите, что хотите получить смещение sum и записать его в dx/ Весь фокус в том, что 80386 это 32 разрядный процессор, а значит и смещение 32 разрядное, а значит его нужно писать не в 16 битный dx, а в 32 битный edx

    Далее
    > assume cs:code, ds:data
    Этой строкой вы говорите, что нухно в cs загрузить базовый адрес сегмента code, а в ds – базовый адрес сегмента data. В связи с этим два вопроса
    1) В чем великмй смысл строчек
    > mov ax, data
    > mov ds, ax
    2) Где инициализация регистра ss?

    И последнее
    > stk segment stack
    > db 256 dup(0)
    > stk ends
    Лучше писать так
    stk segment stack
    db 256 dup(?)
    stk ends
    этим вы просто говорите, что резервируется 256 байт и при этом не генерируется код на их инициализацию нулями

  10. 3
    Егор Решецкий ответил:

    Антон Щиров: не, не помогает))

    Ошибки вот такие:

    KR2.ASM(9): error A2006: Phase error between passes
    KR2.ASM(19): error A2057: Illegal size for operand
    KR2.ASM(27): error A2057: Illegal size for operand

    0 Warning Errors
    3 SevereErrors

  11. 2
    Антон Щиров ответил:

    Может так?
    a:
    lea esi, array

  12. 1
    Андрей Кадацкий ответил:

    что за ошибки выдает?

Клуб программистов работает уже ой-ой-ой сколько, а если поточнее, то с 2007 года.