[Logo] Форум DL
  [DL]  На главную страницу 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3, 4
Автор Сообщение
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Видео - отладка программы на ассемблере

"Тесты иногда проходят, иногда нет"

1. Не инициализирован регистр, значение из которого используется +1
2. Вторая ветка всегда выполняется
3. Команда IMUL не устанавливает флаги
4. Анализ не того теста

При тестировании выдается сообщение
"Тест не прошел по времени"


Происходит зацикливание программы
1. Неправильно указана метка для перехода
2. Бесконечный цикл
3. Постоянная загрузка входных значений


При тестировании выдается сообщение
"Ошибка исполнения программы: Unknown instruction"


1. В начале программы нет инструкции перехода на исполнимый код.
2. В конце программы нет команды останова.
3. Пропуск конца строки.
4. Переход по неправильному адресу.
5. Неправильное использование индексного регистра.
6. Переход по инструкции условного перехода вне диапазона -128/+127.

При тестировании выдается сообщение
"Ошибка компиляции (i86): Неверный символ E"

1. В строке объявления IN_STR нет закрывающей кавычки

При тестировании на DL не проходит тест, который проходит при ручной проверке
1 (занесение ответа не в ту переменную)
2 (неправильно расположена точка останова ;$e)
3 (знаковое/беззнаковое сравнение)


Разное

Как исследовать проблему
Неправильно работает условный переход
i8086.bat не запускает корректно Winter (на машине отсутствует D:\Olymp) +1
Как увеличить размер шрифта
Как добавить в редактор Ctrl+C, Ctrl+V
Как работать с 32-битным числом +1
Решение не проходит при подключении тестов с DL, но тестировании на DL решение проходит +1 ;$E
Integer overflow
65533 - что за число?
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
В начале программы нет инструкции перехода на исполнимый код.
; здесь должен быть переход на метку begin  (jmp begin)
a	db	5
b	db	6
y	db	0
begin:
	Mov	al,a
	Mov	bl,b
	cmp	al,dl
	jl	met1
	Mov	y,5
	jmp	met2
met1:
	Mov	y,10
met2:

halt:
	jmp	halt ;$E

Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
В конце программы нет команды останова.
	JMP	BEGIN
ST0	DB	"DAGHJUA#"
ST1	DB	100 DUP (?)

ST2	DB	"ABCDEFGHIJKLMNOPQRTUVWXYZ#"

BEGIN:
	LEA BX,ST0
	MOV CL,'#'
	CMP [BX],CL
	JE FIN
	LEA DI,ST1
	MOV SP,0
	LEA SI,ST2
	DEC SI

MET0:
	INC SP
	INC BX
	CMP [BX],CL
	JNE MET0


MET1:
	CMP SP,0
	JE FIN
	INC SI
	MOV AL,[SI]
	LEA BX,ST0

MET2:
	CMP [BX],CL
	JE MET1
	CMP [BX],AL
	JE MET3
	INC BX
	JMP MET2


MET3:
	MOV [DI],AL
	INC DI
	INC BX
	DEC SP
	JMP MET2

FIN:
END

; здесь должна быть команда останова jmp 0    ;$E

Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
При выполнении условия завершения строки (CX == 0) следует переход по той же метке как если бы строка не завершилась. После чего программа выходит за пределы массивов, что приводит к записи случайных чисел в область кода программы.
	jmp	begin
str_in	db	'qwerta#..............................................................................'
str_out	db	'.....................................................................................'
begin:
	lea bx,str_in
	mov cx,0
	dec bx
	mov al,'#'
pisun:
	inc bx
	inc cx
	cmp [bx],al
	jne pisun
left:
	dec cx
	lea bx,str_in
	lea di,str_out
	jmp cheak
met1:
	dec cx
	inc bx
	mov al,0
	cbw
	cmp ax,cx
	jne cheak

	jmp cheak

met2:
	dec cx
	inc bx
	mov al,'o'
	mov [di],al
	inc di
	mov al,0
	cbw
	cmp ax,cx
	je met4
cheak:
	mov al,'r'
	cmp [bx],al
	je met1
	mov al,'a'
	cmp [bx],al
	je met2
	mov al,[bx]
	mov [di],al
	inc bx
	inc di
	loop cheak
met4:
halt:
	jmp	halt ;$e

Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Выполняется переход по абсолютному адресу в область данных.
	jmp	begin
x	dw	0
y	dw	0ffffh
a	db	0f3h
b	db	10

r	dw	0
begin:	mov	ax,x
	cmp	ax,1
	
	jl	1
	
	mov	al,b
	cbw
	mov	bx,ax
	mov	ax,x
	add	ax,bx
	mov	bx,ax
	mov	al,a
	cbw
	imul	y
	sub	bx,ax
	mov	al,b
	cbw
	cwd
	idiv	x
	add	bx,ax
	mov	r,bx
	jmp	ends
met:	mov	ax,x
	sub	ax,1
	mov	bx,ax
	mov	al,a
	cbw
	imul	bx
	mov	bx,ax
	mov	al,b
	cbw
	add	ax,y
	cwd
	mov	cx,3
	idiv	cx
	add	bx,ax
	mov	r,bx
ends:	jmp	0	;$E

Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
BX используется для индексирования входной строки. Инструкция mov bl,[bx] изменяет значение регистра BX. Дальнейшее использование этого регистра ведет к ошибкам т.к. он больше не указывает на входную строку.
	jmp	begin
str	db	"abcdabc*"
char	db	'т'
str_rez	db	20 dup (?)
	db	0ah,0dh

begin:
	mov	al,'*'
	lea	bx,str
	lea	si,str_rez
	mov	ah,char

c:
	cmp	[bx],al
	je	endc
	cmp	[bx],ah
	jne	m1
	inc	bx
	mov	bl,[bx]
	mov	[si],bl
	inc	bx
	inc	si
	jmp	c

m1:
	
	mov	bl,[bx]
	
	mov	[si],bl
	inc	bx
	inc	si
	jmp	c

endc:
	mov	[si],al
ends:
	jmp	ends

Екатерина Марченко

Темы: 0
Сообщений: 13

Мой профиль
Оценка\Индивидуальные задания\По выбору\Сконвертированные задания на программирование\Непростая арифметика\4 - "Умножение двух знаковых чисел" 81033

http://dl.gsu.by/task.jsp?nid=990131&cid=835
мое решение:
jmp begin
x dw 1
y dw 1
p dd 0
begin: mov ax,x
imul y
lea bx,p
mov [bx],ax
add bx,2
mov [bx],dx
ends: jmp ends ;$e

выдает ошибку: [test 4]: WInter: программное исключение.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Екатерина Марченко:

Оценка\Индивидуальные задания\По выбору\Сконвертированные задания на программирование\Непростая арифметика\4 - "Умножение двух знаковых чисел" 81033

http://dl.gsu.by/task.jsp?nid=990131&cid=835
мое решение:
jmp begin
x dw 1
y dw 1
p dd 0
begin: mov ax,x
imul y
lea bx,p
mov [bx],ax
add bx,2
mov [bx],dx
ends: jmp ends ;$e

выдает ошибку: [test 4]: WInter: программное исключение.  

Тесты исправлены, решение перетестировано.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Задача:

Дана строка (не более 50 символов). Удалить из строки все буквы r и заменить все буквы a на o. В конце строки стоит символ #
 


	jmp begin
str_in db 'aaaa#'
str_out db '...................'

begin:
	lea bx,str_in
	mov cl,'#'
	lea di,str_out
	dec di
	dec bx
met1:	inc bx
inc di
cmp [bx],cl
	jne met2
	jmp otvet

met2:
        mov ah,'a'
	cmp [bx],al
	je me2
	cmp [bx],ah
	je me3
	mov ch,[bx]
	mov [di],ch

	jmp met1
me2:
	inc bx
	dec di
	jmp met2
me3:
mov ah,'o'
mov[di],ah
jmp met2
otvet:
	jmp otvet  ;$E

При тестировании выдается сообщение "Тест не прошел по времени".

Программа зацикливается из-за неправильно указаной метки для перехода после замены символа 'a' на 'o'. Вместо правильной met1 указана met2.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
Тест не прошел по времени
	jmp	begin
a	dw	2
b	dw	2
y	dw	2
begin:
	mov	ax,a
	mov 	bx,b
	cmp	ax,bx
	jg	met1
	jl	met2
	je	met3

met1:
	sub 	ax,bx
	mov	y,ax
	jmp	met1
met2:	add	ax,bx
	mov	y,ax
	jmp	met4

met3: 	mov	ax,a
	imul	b
	mov	y,ax
met4:

ends:	jmp	ends  ;$E

При переходе на met1 получается бесконечный цикл.
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль
	jmp	begin
a	db	60
b	db	30
res	db	0
begin:	mov	al,a
	mov	bl,b
	cmp	al,bl
	jg	dim1
	jl	dim2
	jmp	vod
dim1:	sub	al,bl
	jmp	begin
dim2:	sub	bl,al
	jmp	begin
vod: 	mov	res,al
fin:
	jmp	fin ;$E


Программа зацикливается, т.к. в al и bl постоянно загружаются входные значения затирая промежуточные результаты.
Evgeniy Evlampev

Темы: 0
Сообщений: 34

Мой профиль
28.3 16:46 1. Задача №1 0 / 100 [test 1]: Тест не прошел: res hex[2]: 0FFFF. 1.i86 DelTA3 at DLServer Winter i86
Я взял тесты, все тесты прошли.
Михаил Долинский

Темы: 1982
Сообщений: 47186

Мой профиль
Добавили ;$e - все равно не прошло

28.03.2013 16:54:54 28.03.2013 16:54:55 ПО-11: Евлампьев, Верхогляд Организация и функционирование ЭВМ (ПО1) - 2013 1. Задача №1 0 [test 1]: Тест не прошел: res hex[2]: 0FFFF. 1.i86 DelTA3 at NewIT
Игорь Коршунов

Темы: 7
Сообщений: 2186

Мой профиль


Евгений Евлампьев:

28.3 16:46 1. Задача №1 0 / 100 [test 1]: Тест не прошел: res hex[2]: 0FFFF. 1.i86 DelTA3 at DLServer Winter i86
Я взял тесты, все тесты прошли.
 


Результаты тестирования в WInter:

[test 1]: Тест прошел.
[test 4]: Тест прошел.
[test 10]: Тест прошел.
[test 12]: Тест прошел.
[test 13]: Тест прошел.
[test 15]: Тест прошел.

[test 2]: Тест не прошел: res dec[2]: 0.
[test 3]: Ошибка исполнения программы: Division by zero.
[test 5]: Тест не прошел: res dec[2]: 0.
[test 6]: Тест не прошел: res hex[2]: 0FFF0.
[test 7]: Тест не прошел: res dec[2]: 18.
[test 8]: Тест не прошел: res dec[2]: 38.
[test 9]: Тест не прошел: res dec[2]: 70.
[test 11]: Тест не прошел: res hex[2]: 0FFE8.
[test 14]: Тест не прошел: res sgn[2]: -2190.
 


	mov	al,d
	cbw
	imul	a
	jl	met1
	jge	met2

Перед использованием инструкции условного перехода нужно установить флаги командой CMP.
Правильно так:
	mov	al,d
	cbw
	imul	a
	cmp	ax, 0
	jl	met1
	jge	met2

Иван Шматко

Темы: 0
Сообщений: 67

Мой профиль
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.
 
Индекс форума ->Учебный процесс ГГУ/СШ 27 ->Проектирование цифровых систем 1, 2, 3, 4
Time:0,081