Автор |
Сообщение |
05.04.2013 13:37:00
Тема: Re:Вопросы и ответы по ASM
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Иван Шматко:
http://dl.gsu.by/task.jsp?cid=859&nid=1081790
jmp begin
a dw 175
b dw 75
nod dw 0
begin:
mov ax,a
mov bx,b
cwd
idiv bx
cmp ax,1
jl lol
cmp dx,0
je win
jmp lok
lol: mov bx,a
mov ax,b
cwd
idiv bx
cmp ax,1
jl lok
cmp dx,0
je win2
jmp lok
win: mov ax,b
mov nod,ax
jmp ends
win2 : mov ax,a
mov nod,ax
jmp ends
lok: mov ax,b
mov bx,a
cwd
idiv bx
mov cx,dx
mov ax,a
cwd
idiv cx
cmp dx,0
jne then
mov ax,a
sub ax,b
mov bx,ax
mov ax,a
cwd
idiv bx
mov cx,dx
cmp ax,0
je k1
mov ax,a
sub ax,b
mov bx,ax
mov ax,b
cwd
idiv bx
cmp ax,0
je k1
cmp dx,cx
je var1
k1: mov ax,a
sub ax,b
sub ax,b
mov ax,a
sub ax,b
sub ax,b
mov bx,ax
mov ax,a
cwd
idiv bx
mov cx,dx
mov ax,a
sub ax,b
sub ax,b
mov bx,ax
mov ax,b
cwd
idiv bx
cmp dx,cx
je var2
var1: mov ax,a
sub ax,b
cmp ax,0
jl var1k
jmp del
var1k: mov ax,a
sub ax,b
mov bx,0
sub bx,ax
mov ax,bx
del: mov nod,ax
jmp ends
var2: mov ax,a
sub ax,b
sub ax,b
cmp ax,0
jl var2k
jmp del2
var2k: mov ax,a
sub ax,b
sub ax,b
mov bx,0
sub bx,ax
mov ax,bx
del2: mov nod,ax
jmp ends
then : mov nod,1
jmp ends
ENDS: JMP ENDS;$E
Uncnown Instruction.
Между инструкцией условного перехода (jne) и меткой не может быть больше 128 байт. В данной программе это 200 байт (можно увидеть в дизассемблере) и переход выполняется не вперед на 200, а назад на 56 байт.
Для разрешения этой проблемы можно использовать инструкцию безусловного перехода, т.е. вместо jne then вставить:
jne then_jmp
jmp not_then
then_jmp:
jmp then
not_then:
|
24.07.2013 12:41:59
Тема: Re:Вопросы и ответы по ASM
|
Владимир Кирдянов
Темы: 0
Сообщений: 89
Мой профиль
|
Лучшие 20 Обсудить задачу в форуме: Экзамен\Индивидуальные задания\Контрольные срезы\Ассемблер\Сам-а1 - "Задача №1" 5593 Илясов Артем
jmp begin
a dw 4
b dw -2
c db -3
d db -1
RES dw 0
begin:
mov ax,a
imul d
mov cx,ax
cmp ax,0
jge met
mov ax,a
cwd
idiv b
mov bx,ax
mov al,c
cbw
add ax,bx
sub ax,cx
mov RES,ax
jmp fin
met:
mov ax,a
cwd
idiv d
mov bx,ax
mov al,c
cbw
add ax,bx
imul b
sub b,ax
mov RES,ax
fin: jmp fin ;$E
Для данных, которые прописаны в программе, правильный ответ -1. Моя программа тоже выдаёт ответ -1, но тесты не проходит.
|
24.07.2013 13:21:03
Тема: Re:Вопросы и ответы по ASM
|
Владимир Кирдянов
Темы: 0
Сообщений: 89
Мой профиль
|
Лучшие 20 Обсудить задачу в форуме: Экзамен\Индивидуальные задания\Контрольные срезы\Ассемблер\Сам-а1 - "Задача №1" 5593 Илясов Артем
jmp begin
a dw 9
b dw 4
c db 2
d db 3
RES dw 0
begin:
mov al,d
cbw
imul a
mov cx,ax
cmp ax,0
jge met
mov ax,a
cwd
idiv b
mov bx,ax
mov al,c
cbw
add ax,bx
sub ax,cx
mov RES,ax
jmp fin
met:
mov al,d
cbw
mov bx,ax
mov ax,a
cwd
idiv bx
mov bx,ax
mov al,c
cbw
add ax,bx
imul b
mov bx,ax
mov ax,b
sub ax,bx
mov RES,ax
fin: jmp fin ;$E
Сперва не проходило 1-ый тест, хотя ответ был правильным. Но я исправил те ошибки, которые были допущены в программе:
mov ax,a
imul d - ошибка
mov al,d
cbw
imul a - вот моё исправление.
mov ax,a
cwd
idiv d - ошибка
mov al,d
cbw
mov bx,ax
mov ax,a
cwd
idiv bx - вот моё исправление.
Потом программа не прошла 2-й тест, т.к. там была тоже ошибка, которую я исправил:
sub b,ax - ошибка
mov bx,ax
mov ax,b
sub ax,bx - вот моё исправление.
Теперь программа не проходит 6-й тест, хотя ответ правильный и ошибок я никаких не заметил.
Вышел и зашёл в саму программу Winter - все тесты моя программа прошла.
|
25.07.2013 07:37:54
Тема: Re:Вопросы и ответы по ASM
|
Михаил Долинский
Темы: 2072
Сообщений: 49883
Мой профиль
|
Владимир Кирдянов:
Лучшие 20 Обсудить задачу в форуме: Экзамен\Индивидуальные задания\Контрольные срезы\Ассемблер\Сам-а1 - "Задача №1" 5593 Илясов Артем
Сперва не проходило 1-ый тест, хотя ответ был правильным.
А в протоколе показывает, что не проходил второй тест:
24.07.2013 12:24:19 24.07.2013 12:24:21 Кирдянов Владимир Архитектура вычислительных систем (М3/ПМ4) - 2013 Сам-а1. Задача №1 0 [test 2]: Тест не прошел: res dec[2]: 0. 1.i86 DelTA3 at NewIT
|
11.08.2013 09:24:40
Тема: Re:Вопросы и ответы по ASM
|
Владимир Кирдянов
Темы: 0
Сообщений: 89
Мой профиль
|
Очень хотелось бы, чтобы при проверке эталонной программой тестов, которые создаются для отсеивания неверных программ в ветке "Экзамен\Индивидуальные задания\Контрольные срезы\Tестирование\", выдавалось в протоколе не просто сообщение типа "Эталонная программа не смогла пройти тесты", а хотя бы сообщения типа
"Эталонная программа не смогла пройти тесты: [test1]: Не объявлена переменная RES",
"Эталонная программа не смогла пройти тесты: [test1]: Размерность переменной y должна быть 2 байта.",
"Эталонная программа не смогла пройти тесты: [test1]: Тест не прошел: res sgn[2]: 1644.",
или/и сообщение о "переполнении"(тоже с указанием имени теста, который приводит к этому),
т.к. порой приходится по 5 раз перепроверять свои тесты в поисках ошибки в вычислениях, а на самом деле всё оказывается, например, в том, что неправильно написал выходную переменную, или в том, что неправильно указал размерность какой-либо переменной.
|
11.08.2013 13:53:34
Тема: Re:Вопросы и ответы по ASM
|
Владимир Кирдянов
Темы: 0
Сообщений: 89
Мой профиль
|
Лучшие 20 Обсудить задачу в форуме: Экзамен\Индивидуальные задания\Контрольные срезы\Ассемблер\Сам-а22 - "Задача №22" 5608 Сосновский Виталий
Мой код:
jmp begin
x dw -5
y db -6
a db 100
c dw -3500
res dw 0
begin:
mov al,y
cbw
imul bx
cmp ax,0
jle next2
jg next
next2:
mov al,a
cbw
mov bx,x
imul bx
push ax
mov al,y
cbw
mov bx,c
imul bx
mov bx,ax
pop ax
add ax,bx
push ax
mov al,a
cbw
mov bx,ax
pop ax
cwd
idiv bx
mov bx,c
sub ax,bx
mov res,ax
jmp ends
next:
mov ax,x
mov bx,c
imul bx
push ax
mov al,y
cbw
mov bx,ax
mov al,a
cbw
imul bx
mov bx,ax
pop ax
sub ax,bx
push ax
mov al,y
cbw
mov bx,x
add ax,bx
mov bx,ax
pop ax
cwd
idiv bx
mov res,ax
ends: jmp ends;$E
И вот написал программу. Решил проверить на тестах её. Прошло пару тестов и выдаёт, что неправильный результат. Я начал проверять тесты в самой программе, просто подставив их значение в сами переменные. Думал, что ошибка у меня в вычислениях выражений, но все результаты совпали. Тогда я и заметил одну странную вещь: порой сравнение (переход) x*y<=0 или x*y>0 программа неправильно проводила. Например, при значениях x=2, y=3 программа могла спокойно пойти по сравнению (переходу) x*y<=0, а не по x*y>0. Но я нашёл ошибку. Всё оказалось просто:
mov al,y
cbw
imul bx
cmp ax,0
jle next2
jg next
Я забыл просто занести в bx значение переменной x:
mov al,y
cbw
mov bx,x
imul bx
cmp ax,0
jle next2
jg next
А потому в bx могло быть любое число. И именно по этой причине программа неправильно совершала переход, т.к. вычисление происходило не x*y, а const*y, где const - это некоторое число, которое находится в bx и которое не зависит от значения переменной x.
Один раз моя неправильная программа умудрилась пройти все тесты, но в большинстве случаев она срезалась либо на 1-м, либо на 2-м, либо на последнем тесте.
Чтобы избежать такой ошибки, можно просто написать так:
mov al,y
cbw
imul x
cmp ax,0
jle next2
jg next
Т.е. производить умножение сразу на x.
Тесты взял из протокола, т.к. я её уже сдавал, но её обнулило, когда я неправильное решение отослал. А потому решил её добить.
|
20.09.2013 17:27:49
Тема: Re:Вопросы и ответы по ASM
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Владимир Кирдянов:
Очень хотелось бы, чтобы при проверке эталонной программой тестов, которые создаются для отсеивания неверных программ в ветке "Экзамен\Индивидуальные задания\Контрольные срезы\Tестирование\", выдавалось в протоколе не просто сообщение типа "Эталонная программа не смогла пройти тесты", а хотя бы сообщения типа
"Эталонная программа не смогла пройти тесты: [test1]: Не объявлена переменная RES",
"Эталонная программа не смогла пройти тесты: [test1]: Размерность переменной y должна быть 2 байта.",
"Эталонная программа не смогла пройти тесты: [test1]: Тест не прошел: res sgn[2]: 1644.",
или/и сообщение о "переполнении"(тоже с указанием имени теста, который приводит к этому),
т.к. порой приходится по 5 раз перепроверять свои тесты в поисках ошибки в вычислениях, а на самом деле всё оказывается, например, в том, что неправильно написал выходную переменную, или в том, что неправильно указал размерность какой-либо переменной.
Сделано.
|
04.01.2014 09:19:23
Тема: Re:Вопросы и ответы по ASM
|
Евгений Калейников
Темы: 0
Сообщений: 142
Мой профиль
|
Здравствуйте, такая проблема. При компиляции кода пишет ошибку "1.esi Ошибка компилятора", но не указывает где эта ошибка была найдена. После перезахода с винтера все пошло отлично! Вот исходник:
jmp begin
a dw 0
b dw 0
c db 0
d db 0
res dw 0
begin:
cmp b,0
jg met1
cmp c,0
jg met1
mov al,d
cbw
mov bx,ax
mov al,c
cbw
mov cx,ax
mov ax,a
imul b
add ax,cx
imul bx
mov cx,ax
mov al,d
cbw
imul a
add ax,b
imul c
cwd
idiv b
sub cx,ax
mov ax,cx
cwd
idiv b
jmp result
met1:
mov al,c
cbw
mov cx,ax
mov ax,a
cwd
idiv b
cwd
idiv cx
mov cx,ax
mov al,d
imul c
mov bx,ax
mov al,d
cbw
cwd
idiv b
sub bx,ax
mov ax,a
imul bx
add cx,ax
mov ax,cx
jmp result
result:
mov res,ax
halt:
jmp halt
|
24.10.2014 09:38:38
Тема: Re:Вопросы и ответы по ASM
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Почему при тестировании на DL не проходит тест, который проходит при ручной проверке?
JMP Begin
x DW 4
y DW 2
res DW 0
begin:
mov ax,x
cmp ax,3
je met1
jl met2
mov ax,x
imul y
add ax,x
add ax,y
jmp fin
met1:
mov ax,x
imul y
mov bx,ax
imul ax
add ax,bx
met2:
mov ax,x
imul y
imul ax
add ax,ax
fin: mov res,ax ;$e
Точка останова установлена на последнюю исполнимую инструкцию, из-за чего при тестировании программа останавливается прежде, чем выполнит эту инструкцию. Правильно заканчивать программу так:
...
mov res,ax
jmp 0 ;$e
|
25.11.2014 14:50:57
Тема: Re:Вопросы и ответы по ASM
|
Владислав Булгаков
Темы: 0
Сообщений: 26
Мой профиль
|
http://dl.gsu.by/task.jsp?nid=1300795&cid=927 при решение задачи при ручной проверке выдает ошибку на 2м тесте, а DL проходит.
jmp begin
a dw 3
b dw -2
c db 3
d db 100
res dw 1
begin:
mov ax,b
cmp ax,0
jg l
jmp m
m:
mov bl,c
cmp bl,0
jle m1
jmp l
m1:
mov ax,a
mov bx,b
imul bx
mov bx,ax
mov al,c
cbw
add ax,bx
mov bx,ax
mov al,d
cbw
imul bx
mov si,ax
mov al,d
cbw
imul a
add ax,b
mov bx,ax
mov al,c
cbw
imul bx
idiv b
sub si,ax
mov res,si
jmp fin
l:
mov ax,a
cwd
idiv b
cwd
mov bx,ax
mov al,c
cbw
xchg ax,bx
idiv bx
mov si,ax
mov al,d
imul c
mov cx,ax
mov al,d
cbw
cwd
idiv b
sub cx,ax
mov ax,cx
imul a
add ax,si
mov res,ax
fin:
jmp fin ;$e
|
25.11.2014 15:05:39
Тема: Re:Вопросы и ответы по ASM
|
Владислав Булгаков
Темы: 0
Сообщений: 26
Мой профиль
|
http://dl.gsu.by/task.jsp?nid=1300795&cid=927 при решение задачи при ручной проверке выдает ошибку на 2,3,4 тесте, а DL проходит.
jmp begin
a dw 3
b dw -2
c db 3
d db 100
res dw 1
begin:
mov ax,b
cmp ax,0
jg l
jmp m
m:
mov bl,c
cmp bl,0
jle m1
jmp l
m1:
mov ax,a
mov bx,b
imul bx
mov bx,ax
mov al,c
cbw
add ax,bx
mov bx,ax
mov al,d
cbw
imul bx
mov si,ax
mov al,d
cbw
imul a
add ax,b
mov bx,ax
mov al,c
cbw
imul bx
idiv b
sub si,ax
mov res,si
jmp fin
l:
mov ax,a
cwd
idiv b
cwd
mov bx,ax
mov al,c
cbw
xchg ax,bx
idiv bx
mov si,ax
mov al,d
imul c
mov cx,ax
mov al,d
cbw
cwd
idiv b
sub cx,ax
mov ax,cx
imul a
add ax,si
mov res,ax
fin:
jmp fin ;$e
|
25.11.2014 15:29:45
Тема: Re:Вопросы и ответы по ASM
|
Владислав Булгаков
Темы: 0
Сообщений: 26
Мой профиль
|
25.11 15:27 ПР. Меньше 0 / 1 Все тесты пройдены (основной + секретный). DelTA3 at NIT5 Winter i86
http://dl.gsu.by/task.jsp?nid=1300802&cid=927
что-то странное.
jmp begin
a db 5
b db 6
y db 1
begin:
mov al,a
cmp al,b
jl n
mov y,5
jmp fin
n:
mov y,10
fin:
jmp fin ;$e
|
23.03.2015 17:20:58
Тема: Re:Вопросы и ответы по ASM
|
Виктория Закревская
Темы: 0
Сообщений: 53
Мой профиль
|
Непонятная ошибка. Буква Е везде английская, я проверила.
23.3 17:19 11. глАснОсть 0 / 300 [1]: Ошибка компиляции (i86): Неверный символ E(69) (строка 41): HALT: JMP HALT ;$E. DelTA3 at DLServer Winter i86
JMP BEGIN
IN_STR DB 'ABCDEAAAreeea aO#'
RES DW 0
DB 0DH,0AH
BEGIN:
LEA BX,IN_STR
MOV CX,0
MOV BP,0
MOV AL,'#'
CMP AL,[BX]
JE FIN
DEC BX
LEN: INC BX
INC CX
CMP AL,[BX]
JNE LEN
DEC CX
DEC BX
CIKL: MOV AL,[BX]
CMP AL,'A'
JE INCA
CMP AL,'O'
JE INCA
CMP AL,'E'
JE INCA
CMP AL,'I'
JE INCA
CMP AL,'U'
JE INCA
DEC BX
LOOP CIKL
JMP FIN
INCA: INC BP
DEC BX
JMP CIKL
FIN: MOV RES,BP
HALT: JMP HALT ;$E
|
23.03.2015 17:25:32
Тема: Re:Вопросы и ответы по ASM
|
Виктория Закревская
Темы: 0
Сообщений: 53
Мой профиль
|
IN_STR DB 'ABCDEAAAreeea aO# '
При добавлении пробелов после # проблема исчезла.
|
24.03.2015 13:33:16
Тема: Re:Вопросы и ответы по ASM
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Виктория Закревская:
Непонятная ошибка. Буква Е везде английская, я проверила.
23.3 17:19 11. глАснОсть 0 / 300 [1]: Ошибка компиляции (i86): Неверный символ E(69) (строка 41): HALT: JMP HALT ;$E. DelTA3 at DLServer Winter i86
JMP BEGIN
IN_STR DB 'ABCDEAAAreeea aO#'
RES DW 0
DB 0DH,0AH
BEGIN:
LEA BX,IN_STR
MOV CX,0
MOV BP,0
MOV AL,'#'
CMP AL,[BX]
JE FIN
DEC BX
LEN: INC BX
INC CX
CMP AL,[BX]
JNE LEN
DEC CX
DEC BX
CIKL: MOV AL,[BX]
CMP AL,'A'
JE INCA
CMP AL,'O'
JE INCA
CMP AL,'E'
JE INCA
CMP AL,'I'
JE INCA
CMP AL,'U'
JE INCA
DEC BX
LOOP CIKL
JMP FIN
INCA: INC BP
DEC BX
JMP CIKL
FIN: MOV RES,BP
HALT: JMP HALT ;$E
В строке объявления IN_STR не было закрывающей кавычки.
|
|
|