Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Задача про 2мерный массив  (Прочитано 11450 раз)
0 Пользователей и 1 Гость смотрят эту тему.
BigBear
Гость
« : 13-06-2009 15:16 » 

16. Пpоцедуpа получает пpи вызове начальный адpес массива из N*M целых чисел в pегистpах  DS:DX и подсчитывает пpоизведение отpицательных элементов пеpвой стpоки таблицы.

Я долго думал и пытался её реализовать. Но всё выходило через.... как обычно кароче. Тогда я накодил в Паскале эту же прогу

Код:
var j,x:integer;
    a:array [1..100,1..100] of integer;
begin
a[1,1]:=-4;
a[1,2]:=-2;
a[1,3]:=-5;
a[1,4]:=3;
a[2,1]:=1;
a[2,2]:=2;
a[2,3]:=3;
a[2,4]:=4;
x:=1;
for j:=1 to 4 do
if a[1,j]<0 then
x:=x*a[1,j];
writeln('x= ',x);
readln;
end.

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

Код:
.code
start:
push    ebp
mov     ebp, esp
add     esp, 0FFFFFFF0h
push    esi
mov     eax, off_40AA9C
mov     byte ptr [eax], 1    ; точно не знаю, но вроде это команда x:=1;
mov     eax, offset dword_408C54
call    sub_405424
mov     dword_40F908, 0FFFFFFFCh  ; -4
mov     dword_40F90C, 0FFFFFFFEh  ; -2
mov     dword_40F910, 0FFFFFFFBh  ; - 5
mov     dword_40F914, 3
mov     dword_40FA98, 1
mov     dword_40FA9C, 2
mov     dword_40FAA0, 3
mov     dword_40FAA4, 4

;for j:=1 to 4 do
mov     esi, 1                      ; делать от 1
mov     edx, 4                        ; до 4

;if a[1,j]<0 then
mov     eax, offset dword_40F908    ; копируем в еах содержимое 40F908 (a[1,j])
telo_cikla:                           
test    eax, eax                    ; проверяем равен ли eax нулю
jge     short noshow             ; если больше или равно нулю, то переходим на loc_4091B5( когда условие не выпонилось)

;x:=x*a[1,j]
imul    esi, eax                    ; иначе умножаем esi на ecx

; этого в паскале не видно, но нужно, здесь мы уменьшаем счетчик цикла и (переменная j)  и меняем элемент массива - ну типо вначале первый потом второй и тп
noshow:
add     eax, 4                        ; eax+4 (таким образом мы смотрим массив, по элементам)
dec     edx                            ;edx -1 (щетчик цикла)
jnz     short telo_cikla            ;если еdx не равно нулю то переходим на loc_4091AC - продолжаем цикл


; иначе
;writeln('x= ',x);
; вызов writeln  разлагается на два вызова writeln вначале вывадим x а затем наше значение
;writeln('x= ')
mov     eax, off_40A9F0                ;какой-то параметр функции, думаю говорит о том что нужно выводить данные на новой строке   
mov     edx, offset dword_4091F8    ;символ x
call    sub_404A24                    ; вызов функции writeln
mov     edx, esi                    ; непосредственно значение x, как видим без доп параметра, значет будем печатать не с новой строки, а продолжим на старой в
; результате x=40, 40 - это к примеру взял
;readln; тут незнаю замороченный вызов readln.
call    sub_4036C4           
call    sub_4036F0
call    sub_402DDC
mov     eax, off_40AA5C
call    sub_40340C
call    sub_402DDC
pop     esi
call    sub_404518
end start

Вот и пробую создать рабочий вариант. Помогите кто сможет.
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 13-06-2009 15:30 » 

а чем помочь-то?
Чего в супе не хватает? (с)
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
BigBear
Гость
« Ответ #2 : 13-06-2009 15:35 » 

Не получается создать рабочую программу. Все мои варианты не запускаются. Поэтому я и прошу у вас помощи
Записан
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 13-06-2009 15:39 » 

в чем не запускаются?
Что про это написано?
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
BigBear
Гость
« Ответ #4 : 13-06-2009 15:48 » 

Ну мож и запускается. Просто из cmd я запускаю её так
C:\asm\tasm.exe prg4.asm - файл не найден пишет.
Но ошибка даже не в этом, что я её неправильно запускаю - при запуске проги изнутри каталога он пишет - программа не найдена
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 13-06-2009 17:53 » 

C:\asm\tasm.exe prg4.asm - файл не найден пишет.
Ты путь к tasm-у (C:\asm) правильно указываешь?
Записан
BigBear
Гость
« Ответ #6 : 14-06-2009 02:02 » 

ну в общем то ДА, если не учитывать
1) Что инсталляции в эту папку не было. Был простой копипаст
2) Имя папки в верхнем регистре.
Записан
BigBear
Гость
« Ответ #7 : 14-06-2009 02:22 » 

C:\DOCUME~1\BigBear>C:\asm\tasm.exe laba
Turbo Assembler  Version 3.2i  Copyright (c) 1988, 1992 Borland International
Serial No:   Tester:

Assembling file:   laba.ASM
**Fatal** Command line: Can't locate file: laba.ASM
Error messages:    1
Warning messages:  None
Passes:            1
Remaining memory:  457k


C:\DOCUME~1\BigBear>C:\asm\tasm.exe C:\asm\laba.asm
Turbo Assembler  Version 3.2i  Copyright (c) 1988, 1992 Borland International
Serial No:   Tester:

Assembling file:   C:\asm\laba.asm  to  laba.OBJ
**Fatal** C:\asm\laba.asm(77) Can't locate file: str2bin.asm
Error messages:    1
Warning messages:  None
Passes:            1
Remaining memory:  453k


С одной проблемой разобрался. Вот где бы найти решение для второй проблемы ? Очевидно мне не хватвет файла. В стандартной комплектации тасма его не было.
Записан
BigBear
Гость
« Ответ #8 : 14-06-2009 02:57 » 

Фсё и с этой проблемой я тоже разобрался. Осталась одна - главная проблема : написать мою программу.

Пpоцедуpа получает пpи вызове начальный адpес массива из N*M целых чисел в pегистpах  DS:DX и подсчитывает пpоизведение отpицательных элементов пеpвой стpоки таблицы.

Есть у кого какие либо мысли Не понял
Записан
BigBear
Гость
« Ответ #9 : 14-06-2009 03:54 » 

Вот вроде я и закончил мою программу. Убедительная просьба проверить, правильно ли я уловил суть этой программы. Другими словами - правильный ли код я составил из обрывков Не понял

Код:
; Пpоцедуpа получает пpи вызове начальный адpес массива из N*M целых чисел в pегистpах  DS:DX
; и подсчитывает пpоизведение отpицательных элементов пеpвой стpоки таблицы.
; целых чисел. Стаpтовый адpес массива - DS:DX, pезультат хpанится в BX
;- СТЕК
STACK  SEGMENT PARA STACK 'STACK'
       DB      64 DUP ('STACK   ')
STACK  ENDS
;-ДАННЫЕ
DATA   SEGMENT PARA PUBLIC 'DATA'
MESSAGE1  DB  'Произведение вычислено $'
MESSAGE2  DB  'Пеpеполнение $'
ARRAY     DW  0,2,23,7,89,-555 ;Исходный массив
DATA   ENDS
CSEG   SEGMENT PARA PUBLIC 'CODE'
       ASSUME CS:CSEG,ES:CSEG,DS:DATA,SS:STACK
;- пpогpамма , вызывающая пpоцедуpу суммы
BEGIN: PUSH DS   ; подготовка стека для pаботы с отладчиком
       SUB AX,AX ;- обнуление AX
       PUSH AX   ;- подготовка стека для отладчика
       JMP set_up;- пеpеход на вызов пpоцедуpы
routine proc far
;-Вычисление суммы элементов массива
        push ax  ;сохpанение
        push DS  ;значимых
        push dx  ;pегистpов
        mov di,dx;- подготовка pегистpа DI для адpесации массива
        mov cx,10;- подговка цикла вычисления
        mov ax,0 ;- AX накапливает сумму
        mov si, dx
        mov dx, 0 ; подготовка регистров
        mov ax, 1 ; к умножению
l1:
        mov bx, [si]
        cmp bx, 0
        jge l2
        mul bx
l2:
        add si, 2
        loop l1   
        jc ovr     ;- пpовеpка пеpеполнения
        add di,2   ;- пеpеход к следующему элементу массива
        mov bx,ax  ;bx- pезультат pасчета
        MOV AX,DATA;- вывод сообщения об окончании pасчета
        MOV DS,AX  ; с помощью функции 9 пpеpывания 21h
        MOV AH,9   ;ФУНКЦИЯ 9 ПРЕРЫВАНИЯ 21Н - ВЫВОД СТРОКИ
        MOV DX,OFFSET MESSAGE1
        INT 21H    ;ВЫВОДИМ СТРОКУ
        jmp calc   ; к завеpшению
ovr:    mov ax,data; вывод сообщения
        mov ds,ax  ; о пеpеполнении
        mov ah,9
        mov dx,offset message2
        int 21h
calc:   pop dx
        pop DS      ;восстановление pегистpов
        pop ax
        retf
routine endp
set_up: mov ax,seg array      ;- занесение адpеса исходного
        mov ds,ax             ;- массива в стаpтовые
        mov dx,offset ARRAY   ;- pегистpы DS и DX
        call routine
;-завеpшение пpогpаммы
        RETF
CSEG    ENDS
        END BEGIN
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines