Обращение к области памяти - Assembler

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Имеется 3 области памяти, в каждой расположен массив. Код1(работает):
; тут все работает отлично, т.к. 3й массив инициализируется в начале(статический).
        pop dx
    pop ax
    
    mov es,ax ;адрес массива А
    mov ss,dx   ;адрес массива B
    
    push    dx ; сохраняю для дальнейшей работы
    push    ax
    
    xor si,si
    xor di,di
    xor bx,bx
    
    mov cx,lenB 
 
ForI:   
        push    cx
    mov cx,lenA
    
    push si
        
    mov ax,word ptr ss:[di] ;массив B
    ForJ:   cmp word ptr es:[si],ax;массив А
        jne NextJ
        add x[bx],1; массив Х
        
        NextJ:  add si,2
    
    loop    ForJ
    
    add di,2
    add bx,2
    pop   si
    pop cx
    loop    ForI
Код2: (ошибка)
;в большинстве случаев, которые я перепробовал массив X 
;был в разы больше заданного размера и заполнен левыми значениями
        pop bx;адрес массива X
    pop ax;адрес массива B
    pop dx;адрес массива A
 
    push    bx
    push    ax
    push    dx
 
    mov es,ax;адрес массива B
    mov ss,dx;адрес массива A
 
    xor si,si
    xor di,di
    xor bp,bp   
    mov cx,lenB 
 
ForI:   push    cx
    mov cx,lenA
    
    push    si  
    push    es; запись адреса массива B в стек
    mov ax,word ptr es:[di];массив B 
    ForJ:   
        cmp word ptr ss:[si],ax; массив A   
        jne NextJ                      
        mov es,ax; es = адрес массива X
        add word ptr es:[bp],1; массив X
        NextJ:  
        add si,2
 
    loop    ForJ
    
    add di,2
    add bp,2
    pop   es ;извлекаю адрес массива B
        pop si
    pop cx
    loop    ForI
Перепробовал много способов, не получается. Регистры сегментов gs и fs компилятор ругает, их использовать не получается. Подскажите, пожалуйста, в какую сторону думать..

Решение задачи: «Обращение к области памяти»

textual
Листинг программы
;3 адреса, 3х массивов: 
;ax; массив 1
;bx;массив 2
;dx;массив 3
;2 сегментных регистра: 
;es,ss; 3й использовать не получается.(fs и gs компилятор ругает)
 
mov es,ax
mov ss,bx
;dx=?
 
xor si,si
xor bp,bp
xor di,di
;цикл:
fori:
push es; помещаю адрес массива 1 в стек 
mov ax,word ptr es:[si]
 
forj:
    add ax,word ptr ss:[di] ; массив 2
    mov es,dx ; это неверно..
    
    mov word ptr es:[bp],ax ;приходится использовать один сегментный регистр, но из-за этого возникает ошибка
 
loop forj
 
pop es ; извлекаю адрес 1го массива
loop fori

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

5   голосов , оценка 4.2 из 5
Похожие ответы