Есть тут пробный код цель проста необходима считать из файла первое число в строку , преобразовать в число поместить его в массив рекордов,затем опять преобразовать в строку и вывести.
Так вот что-то оно выдает ошибки в строках с 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
Примечание:
проблема решена)))
RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.
Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.
Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.