Вопрос по Ассемблеру про setfield и getfield

программирование обучение assembler

Есть тут пробный код цель проста необходима считать из файла первое число в строку , преобразовать в число поместить его в массив рекордов,затем опять преобразовать в строку и вывести.

Так вот что-то оно выдает ошибки в строках с setfield и getfield пишет: Argument to operation or instruction has illegal size
файл соддержит :360 66 46
Так вот чтото
.model small
.stack 100
myzapisi record deg:9,min:6,sec:6
.data
b myzapisi 5 dup (<0,0,0>)
mes4 db 'Erorr', '$'
mes5 db 'File was opened', '$'
mes6 db 'File was closed', '$'
number dw 0
max dw 4
buffer db 18 dup (?),'$'
buffer2 db 18 dup (?),'$'
stroka db 19 dup(?),'$' ;число преобразуем в строку
fileName db 'BD.TXT', 0h ;имя файла
handler dw 0 ;дескриптор файла
.code
.startup
assume ss:@stack, ds:@data, cs:@code
push ds
push 0
mov ax, @data
mov ds, ax
mov es, ax

call openFile

mov ah, 3Fh ;;;scitivaem iz faila pervoe cislo i pomeshaem v buffer
mov bx, handler
mov cx, 3
lea dx, buffer
int 21h

call atoi ;iz stroki soderjasheisea v buffer v cislo

mov bx,ax
setfield deg b[0],bx ;pomeshen iz buffera v zapisi ;;!!!!!!!!!!!!!!!!!
xor ax,ax
getfield deg ax,b[0] ;pomeshaem iz zapisi v ax ctob vivesti ;;!!!!!!!!!!!!!!!!!

call itoa ;iz cifri v stroku dlea vivoda

mov ah,9
mov dx,offset si ;;ili stroka no si eto adres
int 21h
;-----------------------------------
atoi proc

mov si, offset buffer
xor dx, dx
start1:
lodsb
test al, al
jz end1
sub ax, '0'
shl dx, 1
add ax, dx
shl dx, 2
add dx, ax
jmp start1
end1:
mov ax, dx
ret
atoi endp
;--------------------------------------
itoa proc
lea si,stroka ;на начало строки
mov byte ptr[si],' '
lea di,stroka+1
cld
mov cx,4
rep movsb
mov cx,10
a1:cmp ax,10 ;0-различий нет 1-есть
jb a2 ;переходит если бит =1
xor dx,dx
div cx
or dl,30h
mov [si],dl
dec si
jmp a1
a2:or al,30h
mov [si],al
ret
itoa endp
end

Примечание:
пример я сам написал, точку входа я просто забыл скопировать но не в этом суть. Ошибку пишет именно в той строке где setfield и getfield я пометил ;;!!!!!!!!!!!!!!!!!

ps;я так понял компилятору почемуто не нравится что у меня deg:9 в описании записи

Примечание:
ну если ктото хочет запустит у себя на компе и проверить )) вот для полноты кода еще
openFile proc ; открываем файл
; входной параметр – регистр dx, содержим имя файла
; процедура открывает файл на чтение
mov dx,offset filename
mov ah, 3Dh
mov al, 0
int 21h

jnc ok
error:
mov ah,9
mov dx,offset mes4 ;;si
int 21h
jmp tt
ok:
mov handler, ax
mov ah,9
mov dx,offset mes5 ;;si
int 21h
tt:
ret
openFile endp

вот еще пролог

assume ss:@stack, ds:@data, cs:@code
push ds
push 0
mov ax, @data
mov ds, ax
mov es, ax

Примечание:
SETFIELD имя_поля регистр/память_приемник, регистр_источник
"Регистр_источник" должен
быть регистром того же или меньшего размера. Если источник мень-
ше, чем приемник, то регистр-источник должен быть младшей частью
другого регистра, имеющего тот же размер, что и приемник. Этот
полный регистр называется рабочим регистром. Используйте данный
регистр для сдвига значения в регистре-источнике, благодаря чему
оно выравнивается по приемнику.

Я добавли просто .386

Примечание:
проблема решена)))
Ответы:
это у вас как библиотека, что то точки входа не видно...
методом исклучения удаляйте временно фрагменты, вычисляя какой из них не идет, добиваясь чтоб компилятор начал связывать...
вообще ошибка, .. вродибы где то фомат, размер числа не соответствует...
скорее всего вы взяли этот код из книги...
по собственному опыту знаю, что часто примеры не работают
корректнее всего и без ошибок описание изложено у автора книги по программированию на ассемблере "Пирогов " инициалы не помню..
и еще .. компилятор пишет номер строки, там где происходит ошибка, у вас не указано


15 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.