Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Низкоуровневое программирование > Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 28.03.2023, 15:33   #1
YaLubluMamu
Пользователь
 
Регистрация: 22.10.2022
Сообщений: 37
По умолчанию МАКРОКОМАНДЫ

Помогите исправить ошибки, пожалуйста.

Код:
CHANGED macro p
local @w4,@m2,@m3

mov bx,p ; Загрузить индекс элемента в bx
dec bx ; Уменьшить индекс на 1, т.к. список начинается с 0
mov al, 254 ; Новое значение элемента
mov byte ptr SPISOK[bx], al ; Заменить элемент в списке

endm

;---------------------------------

tanya segment 'code'
assume cs:tanya, ds:tanya, ss:tanya, es:tanya
org 100h
begin: jmp main

;-------Data -------------------
SPISOK db 17,35,88,23,18,31,34,58,72,95
       db 41,61,53,28,60,65,72,12,11,77,?
	   
mes db 10,13,'What element should I change?', 10,13,'$'
buf db 4,4 dup(?)
ps db 10,13,'$'
sk db ?
des db ?
ed db ?
elem db ?  
xx db ?  
len db ?   
;---------------------------------

main proc near
;-------Команды программы --------
mov sk,20 
call print
call fun
;************* Макровызов********************************
CHANGED elem
;****************************************************
mov sk,26   
call print
ret
main endp

; *********Считываем введённое число***************
fun proc near
; подсказка
mov ah,09
lea dx,mes
int 21h
; считываем с экрана число как строку
mov ah,0ah
lea dx,buf
int 21h
; преобразуем строку в число
cmp buf+1,1 ; сколько символов ввели?
jne @w1
;один символ ввели
mov al,buf+2
sub al,30h
jmp @w2 
@w1: ; две цифры
mov al,buf+2
sub al,30h
mov bl,10
imul bl
mov bl,buf+3
sub bl,30h
add al,bl
@w2: 
mov elem,al
; перевод строки
mov ah,09
lea dx,ps
int 21h
ret
fun endp


;*******выводим список на экран**********************************
print proc near
mov cl,sk
mov bp,0
@w3:
mov al,SPISOK+bp ; один элемент списка
cbw ; al --> ax
mov bl,10
idiv bl
mov des,al
mov ed,ah
; выводим десятки
mov ah,02
mov dl,des
add dl,30h
int 21h
; выводим единицы
mov ah,02
mov dl,ed
add dl,30h
int 21h
; выводим пробел
mov ah,02
mov dl,' '
int 21h
add bp,1 ; переход к следующему элементу
loop @w3
mov ah,09
lea dx,ps
int 21h
; ожидание нажатия на клавишу
mov ah,08
int 21h
ret
print endp


tanya ends
end begin

Последний раз редактировалось YaLubluMamu; 28.03.2023 в 15:48.
YaLubluMamu вне форума Ответить с цитированием
Старый 28.03.2023, 15:34   #2
YaLubluMamu
Пользователь
 
Регистрация: 22.10.2022
Сообщений: 37
По умолчанию

Само задание: Изменить значение элемента, номер которого передан в параметре на
число 254. Длина списка равна 20 элементов.
YaLubluMamu вне форума Ответить с цитированием
Старый 28.03.2023, 16:42   #3
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Код:
CHANGE macro p
;    local @w4, @m2, @m3
	xor	bh,bh; Обнулить старшую часть bx
	mov	bl,p ; Загрузить индекс элемента в bx
	dec	bx ; Уменьшить индекс на 1, т.к. список начинается с 0
	mov	al, 254 ; Новое значение элемента
	mov	byte ptr SPISOK[bx], al ; Заменить элемент в списке
endm

;---------------------------------

tanya segment 'code'
assume cs:tanya, ds:tanya, ss:tanya, es:tanya
org 100h
begin:
	jmp	main

;-------Data -------------------
SPISOK	db 17,35,88,23,18,31,34,58,72,95
	db 41,61,53,28,60,65,72,12,11,77,0;?
	   
mes	db 10,13,'What element should I change?', 10,13,'$'
buf	db 4,0,4 dup(?)
ps	db 10,13,'$'
sk	db ?
des	db ?
ed	db ?
elem	db ?  
xx	db ?  
len	db ?   
sign  db ?
;---------------------------------

    main proc near
	mov	ax,cs
	mov	ds,ax
	mov	es,ax
;-------Команды программы --------
	mov	sk,20 
	call	print
	call	fun
;************* Макровызов********************************
	CHANGE	elem
;****************************************************
	mov	sk,26
	call	print
	ret
    main endp

; *********Считываем введённое число***************
    fun proc near
; подсказка
	mov	ah,09
	lea	dx,mes
	int	21h
; считываем с экрана число как строку
	mov	ah,0ah
	lea	dx,buf
	int	21h
; преобразуем строку в число
	cmp	buf[1],1 ; сколько символов ввели?
	jne	@w1
;один символ ввели
	mov	al,buf[2]
	sub	al,30h
	jmp	@w2 
    @w1: ; две цифры
	mov	al,buf[2]
	sub	al,30h
	mov	bl,10
	imul	bl
	mov	bl,buf[3]
	sub	bl,30h
	add	al,bl
    @w2: 
	mov	elem,al
; перевод строки
	mov	ah,09
	lea	dx,ps
	int	21h
	ret
    fun endp


;*******выводим список на экран**********************************
    print proc near
	mov	cl,sk
;	mov	bp,0
	mov	si,offset SPISOK

    @w3:
;	mov	al,SPISOK[bp] ; один элемент списка
	lodsb	; al = byte ptr [ds:si]
	mov	dl,'+'
	cbw	; al --> ax
	test	ax,ax
	jns	@unsigned
	mov	dl,'-'
	neg	ax

    @unsigned:
	mov	sign,dl
	mov	bl,10
	idiv	bl
	mov	ed,ah
	cbw	; al --> ax
	idiv	bl
	mov	des,ah
; выводим знак
	xchg	sign,al
	cmp	al,'-'
	jnz	@s0
	mov	ah,02
	mov	dl,al
	int	21h

    @s0:
	mov	al,sign
; выводим сотни
	cmp	al, 0
	jz	@s1
	mov	ah,02
	mov	dl,al
	add	dl,30h
	int	21h

    @s1:
; выводим десятки
	cmp	des,0
	jz	@s2
	mov	ah,02
	mov	dl,des
	add	dl,30h
	int	21h

    @s2:
; выводим единицы
	mov	ah,02
	mov	dl,ed
	add	dl,30h
	int	21h

; выводим пробел
	mov	ah,02
	mov	dl,' '
	int	21h
;	add	bp,1 ; переход к следующему элементу
	loop	@w3
	mov	ah,09
	lea	dx,ps
	int	21h
; ожидание нажатия на клавишу
	mov	ah,08
	int	21h
	ret
    print endp


tanya ends
end begin
Должно работать, я не проверял. Для TASM надо запускать qemu и переносить туда текст программы.
Из ошибок:
* Вы использовали в макросе и в процедуре print регистр bp для адресации и не указывали сегмент. Для bp сегмент по умолчанию ss, а не ds.
* У вас в макрос передаётся значение размером byte, а вы записываете его в регистр размером word
* В массиве SPISOK последний элемент объявлен как ? - это не терминатор. Он означает неопределённое значение. Надо явно указывать значение терминатора списка (я выбрал 0)
* Для функции 0Ah надо указывать буфер следующего вида:
db count, value, count dup (0)
где count - число байт в буфере, value - байт длины строки введённой в буфер, count dup (0) - место для строки
* Забыли вывести сотни у чисел типа byte (даже со знаком эти числа находятся в диапазоне -128 .. 127). Но число 254 не умещается в диапазон чисел со знаком и поэтому будет отображаться как 2
* Добавил вывод знака числа.

Последний раз редактировалось macomics; 28.03.2023 в 18:09.
macomics вне форума Ответить с цитированием
Старый 28.03.2023, 17:53   #4
YaLubluMamu
Пользователь
 
Регистрация: 22.10.2022
Сообщений: 37
По умолчанию

macomics, спасибо большое
YaLubluMamu вне форума Ответить с цитированием
Старый 28.03.2023, 18:11   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Если в процедуре print измените первую команду cbw на xor ah, ah, тогда число 254 тоже сможет быть отображено на экране как и задано.
macomics вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
использование макрокоманды ЗадатьВремПеременную ruslan_sul Microsoft Office Access 6 12.07.2017 19:18
Отладка и выполнение программ, использующих макрокоманды (С++)) Alferd Помощь студентам 2 05.03.2014 15:08
Макрокоманды JaZZ_XVIII Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 10.06.2009 08:12
Ошибка выполнения макрокоманды OpenReport Khabibula Microsoft Office Access 3 12.09.2008 08:07