Лидеры рейтинга

ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

1061

Россия, пос. Теплоозёрск, ЕАО


ID: 226425

Konstantin Shvetski

Модератор

314

Россия, Северодвинск


ID: 401284

Михаил Александров

Советник

278

Россия, Санкт-Петербург


ID: 137394

Megaloman

Мастер-Эксперт

158

Беларусь, Гомель


ID: 400669

epimkin

Профессионал

105


ID: 404002

sglisitsyn

6-й класс

42


ID: 242862

Hunter7007

Мастер-Эксперт

30

Россия, Омск


8.10.3

30.10.2021

JS: 2.10.3
CSS: 4.6.0
jQuery: 3.6.0
DataForLocalStorage: 2021-12-04 11:45:59-standard


Создание программ на языке Assembler.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)

Консультация онлайн # 201565

Раздел:  Assembler
Автор вопроса: kolyatimushev (Посетитель)
Дата: 27.10.2021, 21:33 Консультация закрыта
Поступило ответов: 1

Здравствуйте! У меня возникли сложности с таким вопросом:
Вот такая задача:
Требуется разработать программу вывода на экран двоичного содержимого двух регистров так, чтобы первоначальное содержимое регистров вводилось с клавиатуры в виде шестнадцатеричных чисел.
Пример информации на экране:
Введите содержимое регистра AX F46B
Введите содержимое регистра BX 5A0C
(AX)=1111010001101011 (BX)=0101101000001100
Оцените пожалуйста мое решение smile

Код
.model tiny
.code
org 100h
begin:
	mov dx,offset mes1
	mov ah,9h
	int 21h
	
	xor bx,bx
	call vvod
	push bx
	
	mov dx,0ah
	mov ah,2h
	int 21h
	
	mov dx,offset mes2
	mov ah,9h
	int 21h
	
	
	xor bx,bx
	call vvod
	pop ax
	xchg ax,bx
	push ax
	call vivod
	pop bx
	call vivod
	ret




vvod proc
mov cx,4
z1:
	mov ah,1
	int 21h
	xor ah,ah
	cmp al,30h
	jb z1
	cmp al,39h
	ja m1
	sub al,30h
	add bl,al
	jmp z2
m1:
	cmp al,41h
	jb z1
	cmp al,46h
	ja z1
	sub al,37h
	add bl,al
z2:
	cmp cx,1
	je z3
	call sdvig
	loop z1
z3:
	ret
vvod endp



sdvig proc
	push cx
	mov cx,4h
aa1:
	shl bx,1h
	loop aa1
	pop cx
	ret
sdvig endp



vivod proc
	mov cx,16
	mov dx,0ah
	mov ah,2h
	int 21h
metka:
	xor dx,dx
	rcl bx,1
	adc dx,30h
	mov ah,02
	int 21h
	loop metka
	ret
vivod endp
mes1 db 'Vvedite soderjimoe registra AX:=$'
mes2 db 'Vvedite soderjimoe registra BX:=$'
end begin


Доброго времени суток!

Оцените пожалуйста мое решение


Для начинающего не плохо.
smile

Но пару советов таки дам.
  1. Код [Assembler]
    mov dx,offset mes1
    	mov ah,9h
    	int 21h
    	xor bx,bx
    	call vvod
    	push bx

    кроме mov dx,offset mes1 и push bx, все остальное можно запихнуть в подпрограмму.
  2. Код [Assembler]
    mov dx,0ah
    	mov ah,2h
    	int 21h

    перевод строки ненужен, просто в само сообщение в начало строки поставьте 10,13,.
  3. Код [Assembler]
    sdvig proc
    	push cx
    	mov cx,4h
    aa1:
    	shl bx,1h
    	loop aa1
    	pop cx
    	ret
    sdvig endp

    О команде SHL BX,CL или SHL BX,4 слышали(для последней нужно разрешить .186 процессор, после модели).
  4. Код [Assembler]
    add bl,al
    z2:
    	cmp cx,1
    	je z3
    	call sdvig
    	loop z1

    чтобы не "городить" такое, сдигать нужно перед суммированинм.
  5. выходные параметры подпрограммы нужно передавать либо в АХ, либо в DX : AX, как это делают ЯВУ, прывыкайте.


Как пример(код ТАСМ):
Код [Assembler]
model	tiny,pascal
locals @@
.code
org	100h
begin:	call	inputNum,offset dbInputAx,16
	push	ax
	call	inputNum,offset dbInputBx,16
	mov	bx,ax
	pop	ax
	call	outputNum,ax,2,offset dbInputAx
	call	outputNum,bx,2,offset dbInputBx
	xor	ax,ax
	int	16h
@@01:	ret
outputNum	proc,a:word,b:word,c:word
uses	ax,bx,cx,dx
	mov	ah,9
	mov	dx,c
	int	21h
	mov	ax,a
	mov	bx,b
	xor	cx,cx
@@02:	xor	dx,dx
	div	bx
	push	dx
	inc	cx
	or	ax,ax
	jnz	@@02
@@03:	pop	ax
	cmp	al,10
	jb	@@04
	add	al,7
@@04:	add	al,'0'
	int	29h
	loop	@@03
	ret
outputNum	endp
dbInputAX	db	10,13,'AX:=$'
dbInputBX	db	10,13,'BX:=$'
inputNum	proc,a:word,b:word
uses	bx,cx,dx
@@00:	mov	ah,9
	mov	dx,a
	int	21h
	xor	cx,cx
	mov	bx,b
@@01:	xor	ax,ax
	int	16h
	cmp	al,13
	jz	@@03
	mov	ah,al
	cmp	al,'0'
	jb	@@01
	cmp	al,'9'
	jbe	@@02
	and	ax,0DFDFh
	cmp	al,'A'
	jb	@@01
	sub	ah,7
@@02:	sub	ah,'0'
	cmp	ah,bl
	jae	@@01
	push	ax
	int	29h
	pop	ax
	mov	al,ah
	xor	ah,ah
	xchg	ax,cx
	xor	dx,dx
	mul	bx
	or	dx,dx
	jnz	@@00
	add	cx,ax
	jmp	@@01
@@03:	mov	ax,cx
	ret
inputNum	endp
	end	begin

Удачи!

Последнее редактирование 01.11.2021, 15:18 Зенченко Константин Николаевич (Старший модератор)


Зенченко Константин Николаевич

Старший модератор
01.11.2021, 15:13
Мини-форум консультации # 201565

q_id

kolyatimushev

Посетитель

ID: 405378

1

= общий =    27.10.2021, 22:14
Зенченко Константин Николаевич:

Добрый вечер!
Есть ли разница при написании процедур?

Код
call procedure

procedure proc
ret
procedure endp

И такой процедуры:
Код
call procedure

procedure:
      ret

Или это одно и тоже, просто разные способы?

q_id

Зенченко Константин Николаевич

Старший модератор

ID: 31795

2

= общий =    27.10.2021, 23:50
kolyatimushev:

это одно и тоже, просто разные способы


Да, но proc...endp выделяют некоторый логический блок кода, попытка прыгнуть в его средину вызовет предупреждение компилятора, об этом, т.е. Вы нарушили некоторую структуру/логику программы. Второй подход - этого сообщения не даст.

В учебных кодах(до 100 строк) быстро находится, в "километровых" - черевато долгими поисками.
А если брать ТАСМ, там вообще все "чудесато".
smile
Завтра покажу.

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

q_id

Зенченко Константин Николаевич

Старший модератор

ID: 31795

3

= общий =    28.10.2021, 16:35
kolyatimushev:

Пишем код:

Код [Assembler]
model	tiny,pascal
.code
org	100h
begin:	call	proc1
	call	proc2
	call	proc3,ax
	ret
proc1:	nop
	ret
proc2	proc
	nop
	ret
proc2	endp
proc3	proc	a:word
uses	ax,bx,cx,dx,si,di
	mov	bx,a
	nop
	nop
	ret
proc3	endp
	end	begin

Получаем листинг:
Код [Assembler]
     1	0000			     model   tiny,pascal
      2	0000			     .code
      3				     org     100h
      4	0100  E8 0008		     begin:  call    proc1
      5	0103  E8 0007			     call    proc2
      6					     call    proc3,ax
1     7	0106  50			     PUSH    AX
1     8	0107  E8 0005			     CALL    PROC3
      9	010A  C3			     ret
     10	010B  90		     proc1:  nop
     11	010C  C3			     ret
     12	010D			     proc2   proc
     13	010D  90			     nop
1    14	010E  C3			     RET     0000h
     15	010F			     proc2   endp
     16	010F			     proc3   proc    a:word
     17				     uses    ax,bx,cx,dx,si,di
1    18	010F  55			     PUSH    BP
1    19	0110  8B EC			     MOV     BP,SP
1    20	0112  50			     PUSH    AX
1    21	0113  53			     PUSH    BX
1    22	0114  51			     PUSH    CX
1    23	0115  52			     PUSH    DX
1    24	0116  56			     PUSH    SI
1    25	0117  57			     PUSH    DI
1    26	0118  8B 5E 04			     mov     bx,a
     27	011B  90			     nop
     28	011C  90			     nop
1    29	011D  5F			     POP     DI
1    30	011E  5E			     POP     SI
1    31	011F  5A			     POP     DX
1    32	0120  59			     POP     CX
1    33	0121  5B			     POP     BX
1    34	0122  58			     POP     AX
1    35	0123  5D			     POP     BP
1    36	0124  C2 0002			     RET     0002h
     37	0127			     proc3   endp
     38					     end     begin

Теперь смотрим, что компилятор создал.
smile

=====
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.
smile

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.

Лучшие эксперты раздела

Зенченко Константин Николаевич

Старший модератор

Рейтинг: 244

Коцюрбенко Алексей Владимирович

Старший модератор

Рейтинг: 197

Лысков Игорь Витальевич

Мастер-Эксперт

Рейтинг: 43

Nastya

1-й класс

Рейтинг: 3

Evgen aka Chuma

6-й класс

Рейтинг: 0

cain52

3-й класс

Рейтинг: 0