Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm для начинающих > Матрицы, адреса, OFFSET


Автор: Metalex 24.10.2010, 17:45
Доброго времени суток всем!
Задание было таково: используя попеременно, если это возможно, или команду загрузки абсолютного адреса или OFFSET заполнить таблицу TablAdr так, чтоб каждый элемент представлял собой адрес соотвествующего элемента таблицы TablB.
Я сделал так:
Код

title lab2.8

sseg segment para stack 'stack'
db 256 dup (?)
sseg ends

Eseg segment para public 'ext'
TablB db 10 dup (4 dup ('G'))
TablAdr dd 40 dup ('H')
Eseg ends

cseg segment para public 'code'
assume cs:cseg, ss:sseg, es:Eseg

start proc far


mov bx,Eseg
mov es,bx
mov si, 0
mov cl, 20

loop8:
mov dl, [TablB[si]]
mov TablAdr[si], [dl]
inc si
mov bx, OFFSET TablB[si]
mov TablAdr[si], [bx]
inc si
loop loop8


ret
start endp

cseg ends
end start


Но не компилится!

Выложу листинг:
Код

Turbo Assembler     Version 4.1        24/10/10 13:34:40        Page 1
lab28.asm
lab2.8


      1
      2    0000                 sseg segment para stack 'stack'
      3    0000  0100*(??)             db    256 dup    (?)
      4    0100                 sseg ends
      5
      6    0000                 Eseg segment para public 'ext'
      7    0000  0A*(04*(47))         TablB db 10 dup (4    dup ('G'))
      8    0028  28*(00000048)         TablAdr dd    40 dup ('H')
      9    00C8                 Eseg ends
     10
     11    0000                 cseg segment para public 'code'
     12                     assume cs:cseg, ss:sseg, es:Eseg
     13
     14    0000                 start proc    far
     15
     16
     17    0000  BB 0000s             mov bx,Eseg
     18    0003  8E C3             mov es,bx
     19    0005  BE 0000             mov si, 0
     20    0008  B1 14             mov cl, 20
     21
     22    000A                 loop8:
     23    000A  26: 8A 94    0000r         mov dl, [TablB[si]]
     24    000F  26: 89 94    0028r         mov TablAdr[si], [dl]
**Error** lab28.asm(25)    Can't convert to pointer
     25    0014  46             inc si
     26    0015  26: 8B 9C    0000r         mov bx, OFFSET TablB[si]
     27    001A  26: 89 9C    0028r         mov TablAdr[si], [bx]
**Error** lab28.asm(28)    Illegal    memory reference
     28    001F  46             inc si
     29    0020  E2 E8             loop loop8
     30
     31
     32    0022  CB             ret
     33    0023                 start endp
     34
     35    0023                 cseg ends
     36                     end start
 Turbo Assembler     Version 4.1        24/10/10 13:34:40        Page 2
Symbol Table
lab2.8



Symbol Name              Type     Value

??DATE                  Text     "24/10/10"
??FILENAME              Text     "lab28      "
??TIME                  Text     "13:34:40"
??VERSION              Number 040A
@CPU                  Text     0101H
@CURSEG                  Text     CSEG
@FILENAME              Text     LAB28
@WORDSIZE              Text     2
LOOP8                  Near     CSEG:000A
START                  Far     CSEG:0000
TABLADR                  Dword     ESEG:0028
TABLB                  Byte     ESEG:0000

Groups & Segments          Bit Size Align  Combine Class

CSEG                  16  0023 Para      Public  CODE
ESEG                  16  00C8 Para      Public  EXT
SSEG                  16  0100 Para      Stack      STACK
 Turbo Assembler     Version 4.1        24/10/10 13:34:40        Page 3
Error Summary
lab2.8


**Error** lab28.asm(25)    Can't convert to pointer
**Error** lab28.asm(28)    Illegal    memory reference
 


Помогите исправить ошибки! Спасибо огромное!

Автор: iff 24.10.2010, 20:43
Ошибки заключаются в том, что в строках 25 и 28 оба операнда инструкции mov обращаются к памяти. Так делать нельзя. Только 1 операнд может быть памятью, другой либо регистр, либо непосредственное значение.

Что же касается исправления ошибок, то я не могу понять структуру массивов.

Автор: Metalex 24.10.2010, 21:15
Один - 10 на 4, другой - 40. Но ведь все равно они линейны обое в памяти.

Автор: iff 25.10.2010, 15:00
Данный код заполняет массив адресов адресами в формате сегмент:смещение.
Код

xor si, si ;mov si,0
xor di,di ;mov di,0
mov cl, 40

loop8:
mov word ptr TablAdr[di+2], Eseg
lea ax, TablB[si]
mov word ptr TablAdr[di], ax
add di, 4
inc si
loop loop8

Цитата(Metalex @  24.10.2010,  17:45 Найти цитируемый пост)
команду загрузки абсолютного адреса 

чтоже это за команда такая? lea?
Размер элементов массива TablAdr - двойное слово, т.е. адрес записывать в формате сегмент:смещение?
Вообщето абсалютный адрес = сегмент * 16 + смещение, тогда логично было бы сделать элементы массива TablAdr размером 1 слово.

Автор: Mikl_ 28.10.2010, 10:49
Цитата(Metalex)
используя попеременно, если это возможно, или команду загрузки абсолютного адреса или OFFSET заполнить таблицу TablAdr так, чтоб каждый элемент представлял собой адрес соотвествующего элемента таблицы TablB
, 
Код
.286
.model small
.stack 256
.code
start:    mov bx,@data
    mov ds,bx
    mov si,0
    mov di,0
    mov cx,40    
@@:    lea bx,TablB[si]
    mov TablAdr[di],bx
    inc si
    add di,2
    loop @b
    mov ah,4Ch
    int 21h
.data
TablB db 40 dup ('G')
TablAdr dw 40 dup (?)
end start
 smile 

Автор: iff 29.10.2010, 10:11
Mikl_, но вроде как ему надо абсолютный адрес загружать... Или может быть...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)