Автор |
Сообщение |
04.04.2016 21:53:54
Тема: Re:Вопросы и ответы по ASM
|
Евгений Бычков
Темы: 0
Сообщений: 59
Мой профиль
|
у меня в процессе отработки пропуска возник вопрос. у меня было задание остортировать два числа(у каждого длина 1 байт).
сначала я использовал алгортим такого вида :
;это не код выполняющий задание, а лишь пример кода который
;(как я предполагал) должен был сработать
JMP BEGIN
a db 255
b db 0
biggest db 0
BEGIN:
mov al , a
cmp al , b
jg STEP
mov al , b
mov biggest, al
jmp endStep
STEP: mov biggest , al
endStep:
ENDS: JMP ENDS ;$E
однако, если сравнивать таким образом, то некорректно сравнивается число 255 (которое есть в тестах)
если же использовать функцию CBW к числу 255, то изменяется значение в регистре. единственный вариант, который пришел мне в голову, это после инструкции CBW явно обнулить значение в регистре AH.таким образом алгоритм стал выглядеть :
JMP BEGIN
a db 255
b db 0
x db 1
y db 0
BEGIN: mov al , b
cbw
mov ah , 0
mov bx , ax
mov al , a
cbw
mov ah , 0
cmp ax , bx
jg MET
mov x , bl
mov y , al
jmp ends
MET:
mov x , al
mov y , bl
ends:
ENDS: JMP ENDS ;$E
мне кажется, что должно существовать более явное решение такой проблемы, или я и должен был поступить таким образом ?
UPD:
после некоторого поиска оказалось что для знаковой и беззнаковой математики используются разные метки перехода. если кто-то из тех, кто наткнется на этот пост будет в них нуждаться, то вот они :
+--------+------------------------------+-------------+--------------------+
|Instr | Description | signed-ness | Flags |
+--------+------------------------------+-------------+--------------------+
| JB/ | Jump if below | unsigned | CF = 1 |
| JNAE/ | Jump if not above or equal | | |
| JC | Jump if carry | | |
+--------+------------------------------+-------------+--------------------+
| JNB/ | Jump if not below | unsigned | CF = 0 |
| JAE/ | Jump if above or equal | | |
| JNC | Jump if not carry | | |
+--------+------------------------------+-------------+--------------------+
| JBE/ | Jump if below or equal | unsigned | CF = 1 or ZF = 1 |
| JNA | Jump if not above | | |
+--------+------------------------------+-------------+--------------------+
| JA/ | Jump if above | unsigned | CF = 0 and ZF = 0 |
| JNBE | Jump if not below or equal | | |
+--------+------------------------------+-------------+--------------------+
и еще англ доки : http://unixwiz.net/techtips/x86-jumps.html
|
05.04.2016 06:20:25
Тема: Re:Вопросы и ответы по ASM
|
Михаил Долинский
Темы: 2072
Сообщений: 49883
Мой профиль
|
Молодец, так и должен поступать настоящий программист для решения проблем.
Кстати, следующая лекция у нас по теме "Таблица команд", где и об этом тоже будет рассказываться.
Маленькое замечание
для знаковой и беззнаковой математики используются разные метки перехода
Разные инструкции сравнения,
которые, в частности, по-разному трактуют число 1111 1111 в байте
Инструкции сравнения JLE и проч., о которых я Вам уже рассказывал, считают, что это число -1.
А инструкции, JAE и проч., о которых буду рассказывать, считают, что это число 255.
|
30.03.2017 15:10:53
Тема: Re:Вопросы и ответы по ASM
|
Анна Голосова
Темы: 0
Сообщений: 28
Мой профиль
|
Добрый день! На лекции 30.03.2017 у нашей группы возникли проблемы с задачей.
Ссылка на задачу - http://dl.gsu.by/task.jsp?nid=1658556&cid=1041
Когда задача не проходила, подключили тесты из протокола, в программе winter тесты не проходили, но при доскональном списывании с подсказки к задаче на dl задачу приняли(при этом в winter программа все равно не проходила)
Еще один вопрос: В тестах символом конца строки принято считать символ '#', а в подсказке к решению предлагают использовать символ '!'.
Тесты из протокола:
Report = report.txt
StopOnError = true
Statistics = false
WatchReport = false
ShowReport = true
[1]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0
IN_STR str: ABCDEfghi#
RES dec[2]: 2
[2]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0
IN_STR str: BCDBCDBCDB#
RES hex[2]: 0000
[3]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0
IN_STR str: AIEOUAIEOB#
RES hex[2]: 0009
[4]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0
IN_STR str: TESTWORD#
RES hex[2]: 0002
[5]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0
IN_STR str: AEIOUY#
RES dec[2]: 5
[6]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0
IN_STR str: BCDFGHJKLMNPQRSTVWXZ#
RES dec[2]: 0
[7]
Cycles = 1000
CheckCycles = true
Segment - 0
Offset - 0
IN_STR str: #
RES dec[2]: 0
Исходник программы, которая прошла на dl:
jmp begin
IN_STR db 'ABCDEfghkjgsdvcksdvckjsdci# '
RES dw 0
db 0DH, 0AH
begin:
lea bx, IN_STR
mov cx, 0
mov bp, 0
dec bx
mov al, '!'
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, 'I'
je inca
cmp al, 'E'
je inca
cmp al, 'O'
je inca
cmp al, 'U'
je inca
dec bx
loop cikl
jmp fin
inca:
inc bp
dec bx
jmp cikl
fin: mov RES, bp
HALF: jmp HALF ;$E
|
30.03.2017 15:51:22
Тема: Re:Вопросы и ответы по ASM
|
Анна Голосова
Темы: 0
Сообщений: 28
Мой профиль
|
Еще раз добрый день!
Возникла похожая проблема с задачей по ссылке http://dl.gsu.by/task.jsp?nid=1658558&cid=1041
Забрала тесты из протокола, в программе winter не проходит даже первый тест. А в dl задача набирает по максимуму.
Тесты:
Report = report.txt
StopOnError = true
Statistics = false
WatchReport = false
ShowReport = false
[TEST1]
Cycles = 1
CheckCycles = true
Segment - 0
Offset - 0
IN1 str: ABSDABC#
OUT1 dec[2]: 2
[TEST2]
Cycles = 1
CheckCycles = true
Segment - 0
Offset - 0
IN1 str: ABSDABCABW#
OUT1 dec[2]: 3
[TEST3]
Cycles = 1
CheckCycles = true
Segment - 0
Offset - 0
IN1 str: BASDE#
OUT1 dec[2]: 0
[TEST4]
Cycles = 1
CheckCycles = true
Segment - 0
Offset - 0
IN1 str: ABafABAB#
OUT1 dec[2]: 3
[TEST5]
Cycles = 1
CheckCycles = true
Segment - 0
Offset - 0
IN1 str: BAbabaBBAbabAb#
OUT1 dec[2]: 0
[TEST6]
Cycles = 1
CheckCycles = true
Segment - 0
Offset - 0
IN1 str: dsEABBArtEA#
OUT1 dec[2]: 1
Исходник программы, которая набрала 100/100
jmp begin
IN1 db 'ABAASBAAB# '
OUT1 dw 0
begin:
lea bx, IN1
mov dx, 0
cikl:
mov al, [bx]
cmp al, '#'
je ends
cmp al, 'A'
jne cont1
inc dx
jmp cont
cont1:
cmp al, 'B'
jne cont2
cmp dx, 0
je cont
inc OUT1
cont2:
mov dx, 0
cont:
inc bx
jmp cikl
ends: jmp ends ;$E
Есть мысли, что это связано с начальной инициализацией входной строки IN1. Если в начале программы написать
IN1 db 'ABAASBAAB#' - первый тест проходит, а во второй выдает сообщение
[TEST1]: Тест прошел.
[TEST2]: Размерность массива IN1 должна быть не менее 11 байтов.
Если же написать
IN1 db 'ABAASBAAB#____________________________' - первый тест не проходит в программе winter, а на dl проходят все
|
31.03.2017 16:51:50
Тема: Re:Вопросы и ответы по ASM
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Анна Голосова:
Добрый день! На лекции 30.03.2017 у нашей группы возникли проблемы с задачей.
Ссылка на задачу - http://dl.gsu.by/task.jsp?nid=1658556&cid=1041
Когда задача не проходила, подключили тесты из протокола, в программе winter тесты не проходили, но при доскональном списывании с подсказки к задаче на dl задачу приняли(при этом в winter программа все равно не проходила)
Еще один вопрос: В тестах символом конца строки принято считать символ '#', а в подсказке к решению предлагают использовать символ '!'.
Пример решения исправлен.
1. Неправильный символ конца строки '!'. Длина строки получалась больше реальной (в зависимости когда попадался '!' в неинициализированной памяти). Соответственно иногда получались неправильные результаты, если до символа '!' встречались гласные буквы.
2. В случае пустой строки в СХ оказывался ноль, а это означало длину строки 65536 байт. Добавил проверку и переход в конец в этом случае.
|
06.04.2017 15:03:27
Тема: Re:Вопросы и ответы по ASM
|
ПО-21 Карпенко
Темы: 0
Сообщений: 1
Мой профиль
|
http://dl.gsu.by/task.jsp?nid=1658612&cid=1041
Я взял тесты, подключил, все тесты пройдены.
Отправляю на проверку, выдаёт ошибку в первом тесте.
Решение найдено: не хватало ";$e".
jmp begin
a dw 2
b dw -3
c db -5
d db 4
RES dw 0
begin:
mov bx,4
cmp a,bx
je met1
mov ax,a
add ax,b
mov bx,ax
mov al,c
imul d
mov cx,0
cmp ax,cx
jl men
jg bol
back:
mov ax,bx
cwd
idiv a
mov RES,ax
jmp halt
met1:
mov al,c
cbw
cwd
idiv a
mov bx,ax
mov al,d
cbw
mov cx,ax
mov ax,b
cwd
idiv cx
add ax,bx
mov bx,ax
mov al,c
cbw
imul a
sub bx,ax
mov RES,bx
halt:
jmp halt
men: add bx,1
jmp back
bol: add bx,-1
jmp back
Report = report.txt
StopOnError = true
Statistics = false
WatchReport = false
ShowReport = true
[test 1]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 5
b sgn[2]: 24
c sgn[1]: 255
d sgn[1]: 249
res sgn[2]: 5
[test 2]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 2
b sgn[2]: 65533
c sgn[1]: 251
d sgn[1]: 4
res sgn[2]: 0
[test 3]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 3
b sgn[2]: 65535
c sgn[1]: 9
d sgn[1]: 253
res sgn[2]: 1
[test 4]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 3
b sgn[2]: 2
c sgn[1]: 2
d sgn[1]: 249
res sgn[2]: 2
[test 5]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 4
b sgn[2]: 6
c sgn[1]: 8
d sgn[1]: 3
res sgn[2]: 65508
[test 6]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 4
b sgn[2]: 65533
c sgn[1]: 4
d sgn[1]: 1
res sgn[2]: 65518
[test 7]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 2
b sgn[2]: 4
c sgn[1]: 0
d sgn[1]: 243
res sgn[2]: 3
[test 8]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 4
b sgn[2]: 8000
c sgn[1]: 80
d sgn[1]: 2
res sgn[2]: 3700
[test 9]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 1
b sgn[2]: 12000
c sgn[1]: 255
d sgn[1]: 255
res sgn[2]: 12000
[test 10]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 1
b sgn[2]: 4000
c sgn[1]: 1
d sgn[1]: 1
res sgn[2]: 4000
[test 11]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 1
b sgn[2]: 5000
c sgn[1]: 255
d sgn[1]: 1
res sgn[2]: 5002
[test 12]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: 1
b sgn[2]: 13333
c sgn[1]: 1
d sgn[1]: 0
res sgn[2]: 13334
[test 13]
Cycles = 1000
CheckCycles = false
Segment - 0
Offset - 0
a sgn[2]: -1000
b sgn[2]: 6999
c sgn[1]: -10
d sgn[1]: 11
res sgn[2]: -6
|
06.04.2017 15:50:50
Тема: Re:Вопросы и ответы по ASM
|
Гурский-Стома
Темы: 0
Сообщений: 1
Мой профиль
|
Командные олимпиады\Программирование\Подготовка к контрольному срезу\Контроль\Ассемблер\2 - "Задача №7" 5599
http://dl.gsu.by/task.jsp?nid=1658612&cid=1041
Ошибка исполнения программы: Integer Owerflow.
В метке equal, операция idiv bl (Деление слова на байт)
Решение найдено:
mov al,d
cbw ;расширяем до слова
mov bx,ax
mov ax,b
cwd ;расширяем до двойного слова
idiv bx ;выполняем деление слово на слово
jmp begin
a dw 4
b dw 8000
c db 80
d db 2
RES dw 0
begin:
mov ax,a
cmp ax,4
je equal
mov al,c
imul d ;ax=c*d
cmp ax,0
je e1
jg e2
mov cx,-1
jmp nequal
e1:
mov cx,0
jmp nequal
e2:
mov cx,1
nequal:
mov ax,a
add ax,b
sub ax,cx ;ax=a+b-sign(c*d)
mov cx,a
cwd
idiv cx
jmp fin
equal:
mov al,c
cbw
cwd
mov bx,a
idiv bx
mov cx,ax
mov ax,b
mov bl,d
idiv bl
add cx,ax ;cx=c/a+b/d
mov al,c
cbw
imul a
sub cx,ax
mov ax,cx
fin:
mov RES,ax
halt:
jmp halt ;$E
|
07.04.2017 16:48:36
Тема: Re:Вопросы и ответы по ASM
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Анна Голосова:
Возникла похожая проблема с задачей по ссылке http://dl.gsu.by/task.jsp?nid=1658558&cid=1041
Забрала тесты из протокола, в программе winter не проходит даже первый тест. А в dl задача набирает по максимуму.
Гурский-Стома:
Командные олимпиады\Программирование\Подготовка к контрольному срезу\Контроль\Ассемблер\2 - "Задача №7" 5599
http://dl.gsu.by/task.jsp?nid=1658612&cid=1041
Ошибка исполнения программы: Integer Owerflow.
Если программа ведет себя локально и при тестировании на DL по-разному возможны такие варианты:
1. Не тот тест. Проверить что подключен именно нужный тест.
2. Тест подключен неверно или испорчен. Еще раз скопировать тест с DL и подключить его в WInter.
3. Ошибка WInter. В этом случае по окончании тестирования выполнение программы останавливается не на последнем операторе, а где-то в середине, где останова быть не должно. Помогает перезапуск WInter.
4. Программа использует неинициализированную память, переменные или регистры. В этом случае при одних и тех же входных данных программа может выдавать разные ответы. Несколько раз запустить тестирование сняв флажок "останавливать при ошибке", если некоторые тесты то проходят, то нет нужно искать где в программе используется неинициализированная память, переменные или регистры.
|
23.11.2017 17:01:56
Тема: Re:Вопросы и ответы по ASM
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
23.11.2017 15:59:49 Скоробогатько Степан
jmp begin
a db -10
c db -20
x dw 40
y dw -50
res dw 0
begin:
mov ax,x
imul y
cmp ax,0
jl metk1
mov al,a
imul a
mov bx,ax
mov ax,x
cwd
idiv bx
mov res,ax
mov al,c
imul c
mov bx, ax
cwd
mov ax, y
cwd
idiv bx
add res, ax
mov ax,x
imul x
mov bx,ax
mov ax,y
imul y
imul bx
sub res,ax
jmp halt
metk1:
mov al,a
cbw
mov bx,ax
mov ax,x
imul ax
idiv bx
mov cx,ax
mov ax,y
imul y
idiv c
cbw
add cx,ax
mov al,c
imul a
sub cx,ax
neg cx
mov res,cx
jmp halt
halt:
jmp halt;E
23.11.2017 16:25:07 СкоробогатькоСтепан
jmp begin
a db -10
c db -20
x dw 40
y dw -50
res dw 0
begin:
mov ax,x
imul y
cmp ax,0
jl metk1
mov al,a
imul a
mov bx,ax
mov ax,x
cwd
idiv bx
mov res,ax
mov al,c
imul c
mov bx, ax
cwd
mov ax, y
cwd
idiv bx
add res, ax
mov ax,x
imul x
mov bx,ax
mov ax,y
imul y
imul bx
sub res,ax
jmp halt
metk1:
mov al,a
cbw
mov bx,ax
mov ax,x
imul ax
idiv bx
mov cx,ax
mov al,c
cbw
mov bx,ax
mov ax,y
imul y
idiv bx
add cx,ax
mov al,c
imul a
sub cx,ax
mov ax, cx
mov bx, -1
imul bx
sub res, ax
jmp halt
halt:
jmp halt;$E
|
21.10.2019 12:37:31
Тема: Re:Вопросы и ответы по ASM
|
Кирилл Курилин
Темы: 0
Сообщений: 11
Мой профиль
|
21.10 12:36 11. глАснОсть 0 / 300 [1]: Ошибка компиляции (i86): Неверный символ E(69) (строка 40): .
jmp begin
IN_STR DB 'ABCDEAAAreeea a0#
RES DW 0
begin:
LEA bx,IN_STR
MOV cx,0
MOV bx,0
DEC bx
mov al,'#'
len:
inc bx
inc cx
cmp al,[bx]
jne len
dec cx
jz fin
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
|
01.03.2021 09:11:50
Тема: Re:Вопросы и ответы по ASM
|
Евгений Мартыненко-Нестеренко
Темы: 0
Сообщений: 13
Мой профиль
|
При попытке отправить решение из онлайн редактора ответило:
source.online - файл с неизвестным расширением. Список известных расширений: .i86, .mpc, .tcpu, .tc, .hex
|
23.11.2021 10:42:02
Тема: Re:Вопросы и ответы по ASM
|
Роман Сеглин
Темы: 0
Сообщений: 17
Мой профиль
|
Организация и функционирование ЭВМ (ПМ4) - 2021
Оценка\Индивидуальные задания\По выбору\Программирование микроконтроллеров\Цифры числа\5 - "Симметричные числа" (45173)
http://dl.gsu.by/task.jsp?nid=2171359&cid=1231
Как решать эту задачу? При делении на 10 число не помещается в двухбайтовый регистр.
|
23.11.2021 10:44:37
Тема: Re:Вопросы и ответы по ASM
|
Роман Сеглин
Темы: 0
Сообщений: 17
Мой профиль
|
Организация и функционирование ЭВМ (ПМ4) - 2021
Оценка\Индивидуальные задания\По выбору\Программирование микроконтроллеров\Цифры числа\7 - "Вычеркивание нулей в десятичном числе" (54355)
http://dl.gsu.by/task.jsp?nid=2171361&cid=1231
Как решать и эту задачу? Вопрос аналогичен предыдущему.
|
25.11.2021 12:52:23
Тема: Re:Вопросы и ответы по ASM
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
Кирилл Курилин:
21.10 12:36 11. глАснОсть 0 / 300 [1]: Ошибка компиляции (i86): Неверный символ E(69) (строка 40): .
jmp begin
IN_STR DB 'ABCDEAAAreeea a0#
Нет закрывающей кавычки.
|
25.11.2021 12:52:52
Тема: Re:Вопросы и ответы по ASM
|
Игорь Коршунов
Темы: 7
Сообщений: 2198
Мой профиль
|
-
|
|
|