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

.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


Обсуждение

давно
Посетитель
405378
6
27.10.2021, 22:14
общий
Адресаты:
Добрый вечер!
Есть ли разница при написании процедур?
Код:

call procedure

procedure proc
ret
procedure endp

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

call procedure

procedure:
ret

Или это одно и тоже, просто разные способы?
давно
Старший Модератор
31795
6196
27.10.2021, 23:50
общий
Адресаты:
Цитата: kolyatimushev
это одно и тоже, просто разные способы

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

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

Завтра покажу.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
28.10.2021, 16:35
общий
Адресаты:
Пишем код:
[code lang=asm]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[/code]
Получаем листинг:
[code lang=asm] 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[/code]
Теперь смотрим, что компилятор создал.
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

давно
Старший Модератор
31795
6196
01.11.2021, 15:13
общий
01.11.2021, 15:18
это ответ
Доброго времени суток!

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

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


Но пару советов таки дам.
    [*][code lang=asm] mov dx,offset mes1
    mov ah,9h
    int 21h
    xor bx,bx
    call vvod
    push bx[/code]
    кроме mov dx,offset mes1 и push bx, все остальное можно запихнуть в подпрограмму.[*][code lang=asm] mov dx,0ah
    mov ah,2h
    int 21h[/code]
    перевод строки ненужен, просто в само сообщение в начало строки поставьте 10,13,.[*][code lang=asm]
    sdvig proc
    push cx
    mov cx,4h
    aa1:
    shl bx,1h
    loop aa1
    pop cx
    ret
    sdvig endp[/code]
    О команде SHL BX,CL или SHL BX,4 слышали(для последней нужно разрешить .186 процессор, после модели).
  1. [code lang=asm] add bl,al
    z2:
    cmp cx,1
    je z3
    call sdvig
    loop z1[/code]
    чтобы не "городить" такое, сдигать нужно перед суммированинм.
  2. выходные параметры подпрограммы нужно передавать либо в АХ, либо в DX : AX, как это делают ЯВУ, прывыкайте.


Как пример(код ТАСМ):
[code lang=asm]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[/code]
Удачи!
Об авторе:
Мне безразлично, что Вы думаете о обо мне, но я рад за Вас - Вы начали думать.

Форма ответа