Всех с Новым Годом! Пытаюсь сделать программу, считающую сумму элементов массива и записывающую ее в файл, выдает ошибки вот в этих строках:
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
Прошу помочь
8 января 2009 в 20:05
Не, не помогает
5 января 2009 в 14:00
Может стоит попробовать после lea esi, array меточку поставить?
5 января 2009 в 14:00
Т.е.
lea esi, array
a:
?
5 января 2009 в 12:02
Антон Щиров
Имеете в виду инициальзацию ss? Как она производится?
3 января 2009 в 23:01
#2
3 января 2009 в 2:01
Спасибо за помощь
Подправил регистр на edx и во втором случае-осталась одна ошибка, в строке сразу за меткой "а". Есть у кого идеи из-за чего?
3 января 2009 в 1:04
> 1) Смысл вообще звучит как вроде "настройка регистра ds", и выполняется уже как ритуал
//ru.wikipedia.org/wiki/Культ_карго
> Исправил по первой ошибке
Дальше мне сказать нечего
3 января 2009 в 1:03
1) Смысл вообще звучит как вроде "настройка регистра ds", и выполняется уже как ритуал
2)Объясните про инициализацию, а лучше напишите как она выглядит, я не в курсе о таком=(
Исправил по первой ошибке (offset sum), подправил сегмент стека…и…о чудо, теперь общее количестиво ошибок уже только две!
3 января 2009 в 0:05
>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 байт и при этом не генерируется код на их инициализацию нулями
3 января 2009 в 0:01
Антон Щиров: не, не помогает))
Ошибки вот такие:
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
2 января 2009 в 22:05
Может так?
a:
lea esi, array
2 января 2009 в 22:05
что за ошибки выдает?