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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 22.01.2023, 22:24   #1
alonil
Пользователь
 
Регистрация: 14.01.2023
Сообщений: 38
По умолчанию Как записать без первых двух макрокоманд.

Код:
  .model small
    .code
minus   db 0
x   dw 0
y   dw 0
mx  db 13,10,"x=$"
my  db 13,10,"y=$"
v1  dw 0
v2  dw 0
result  dw 0
mres    db "=$"
task1   db 13,10,"Task 1: 13/x/x+(y*y+1)/2-1$"
task2   db 13,10,"Task 2: 6*x+y*y*y/9+7$"
task3   db 13,10,"Task 3: 4*x*x+y*y/6-4$"
ofrange db 13,10,"x or y in illegal range$"
mover   db 13,10,"Multiply overflow$"
; буфер ввода числа (знак -, 5 десятичных цифр, знак конца строки)
inpbuf db 6+1
inplen db 0
ibuf2  db 6+1 dup (0)
ierror  db 13,10,"Input error$"
; буфер вывода 10 ичного числа
bufout db "00000000$"
 
print   macro txt
    push ax
    push dx
    mov dx,offset txt
    mov ah,9
    int 21h
    pop dx
    pop ax
    endm
 
inputs  macro txt,val
    print txt
    mov dx,offset inpbuf
    mov ah,10
    int 21h
    call str2dec
    jc ier
    mov val,cx
    endm
 
start:  mov ax,cs
    mov ds,ax
    mov es,ax
    inputs mx,x
    inputs my,y
    call istask1
    jnc  dotask1
    call istask2
    jnc  dotask2
    call istask3
    jnc  dotask3
    print ofrange
    int 20h
overflow:print mover
    int 20h
ier:    print ierror
    int 20h
 
dotask1:print task1
    call calc1
    jmp printresult
dotask2:print task2
    call calc2
    jmp printresult
dotask3:print task3
    call calc3
    jmp printresult
 
printresult:print mres
    call dec2str
    int 20h
 
calc3:  mov ax,4 ; 4*x*x
    cwd
    imul x
    imul x
    cmp dx,0
    jnz overflow3
    mov v1,ax
    mov ax,y
    cwd
    imul y
    cmp dx,0
    jnz overflow3
    mov bx,6
    idiv bx
    mov v2,ax
    add ax,v1
    sub ax,4
    mov result,ax
    ret
overflow3:jmp overflow
 
calc2:  mov ax,6 ; 6*x
    cwd
    imul x
    cmp dx,0
    jz skip2
    cmp dx,-1
    jz skip2
    jmp overflow2
skip2:  mov v1,ax
    mov ax,y ; y*y*y/9
    cwd
    imul y
    cmp dx,0
    jnz overflow2
    imul y
    cmp dx,0
    jz skip20
    cmp dx,-1
    jz skip20
    jmp overflow2
skip20: mov bx,9
    idiv bx
    mov v2,ax
    add ax,v1
    add ax,7
    mov result,ax
    ret
overflow2:jmp overflow
 
calc1:  mov ax,13 ; 13/x/x
    cwd
    idiv x
    cwd
    idiv x
    mov v1,ax
    mov ax,y ; (y*y+1)/2
    imul y
    cmp dx,0
    jnz overflow1
    inc ax
    shr ax,1
    mov v2,ax
    add ax,v1
    dec ax
    mov result,ax
    ret
overflow1: jmp overflow
 
istask1:cmp x,11
    jle notask1
    cmp y,3
    jge notask1
    clc
    ret
notask1:stc
    ret
istask2:cmp x,11
    jne notask2
    cmp y,3
    jne notask2
    clc
    ret
notask2:stc
    ret
istask3:cmp x,11
    jge notask3
    cmp y,3
    jle notask3
    clc
    ret
notask3:stc
    ret
 
;*******************
 
; ввод CX в 10 ричном виде из строки SI
str2dec:mov minus,0
    lea si,ibuf2
       mov cx,0
sth1:  lodsb     ; читать символ строки
       cmp al,13 ; конец строки ? Выход
       jz sth2
    cmp al,"-"
    jnz sth4
    mov minus,-1
    jmp sth1
sth4:   
       push ax
       mov ax,10 ; cx=cx*10
       mul cx
       mov cx,ax
       pop ax
    
       call todigit ; преобразовать символ в цифру
       jc sth3
       mov ah,0     ; прибавить к cx цифру
       add cx,ax
    adc dx,0
    test cx,8000h ; проверить число на переполнение
    jnz sth3
    cmp dx,0
    jnz sth3
       jmp sth1
sth2:  cmp minus,0
    jz sth5
    neg cx
sth5:   clc          ; норма
       ret
sth3:  stc          ; не норма - неверный символ
       ret
 
; преобразовать символ al в цифру
todigit:cmp al,"0"
    jc notdigit
    cmp al,"9"+1
    jnc notdigit
    sub al,"0"
    clc
    ret
notdigit:mov al,0
    stc
    ret
 
; печать AX в 10 ричном виде
dec2str:
    push ax
    mov di,offset bufout
    mov al,32 ; пробел
    mov cx,8
    rep stosb ; очистить строку буфера
    pop ax
    mov di,offset bufout
    cmp ax,0 ; для отрицательного числа поставить минус и изменить знак
    jge dec1
    neg ax ; ax<0 - добавить минус и поменять знак 
    mov byte ptr [di],"-"
    inc di
dec1:   mov cx,0 ; записать цифры в стек начиная с младшей
    mov si,10
dec2:   mov dx,0
    div si
    push dx
    inc cx
    cmp ax,0
    jnz dec2
dec3:   pop ax ; считать цифры из стека и записать в буфер текста
    add al,"0"
    stosb
    loop dec3
        print bufout ; вывести bufout на печать
    
    ret
 
    end start
alonil вне форума Ответить с цитированием
Старый 22.01.2023, 22:27   #2
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Первые 2 команды это
Код:
mov ax, cs
mov ds, ax
Они нужны, чтобы все было настроено на работу с одним сегментом.

Можете разместить код в COM программе. Там сама DOS настраивает все сегментные регистры в начало на PSP программы.
macomics вне форума Ответить с цитированием
Старый 22.01.2023, 23:09   #3
alonil
Пользователь
 
Регистрация: 14.01.2023
Сообщений: 38
По умолчанию

Хотел убрать макрокоманды отсюда,но что-то не очень выходит.
Код:
  .model small
data segment 
minus   db 0
x   dw 0
y   dw 0
mx  db 13,10,"x=$"
my  db 13,10,"y=$"
v1  dw 0
v2  dw 0
result  dw 0
mres    db "=$"
task1   db 13,10,"Podxodiat yravneniu 1: 13/x/x+(y*y+1)/2-1$"
task2   db 13,10,"Podxodiat yravneniu 2: 6*x+y*y*y/9+7$"
task3   db 13,10,"Podxodiat yravneniu 3: 4*x*x+y*y/6-4$"
ofrange db 13,10,"x or y ne sootvetstvyut odnovremenno kakomy-to ysloviu$"
mover   db 13,10,"Multiply overflow$"

inpbuf db 6+1
inplen db 0
ibuf2  db 6+1 dup (0)
ierror  db 13,10,"Input error$"
bufout db "00000000$"
data ends
stk segment stack
   db 256 dup(?)
stk ends
code segment
     assume cs:code,ds:data,ss:stk
 start:  
 mov ax,data
 mov ds,ax

    mov ah, 09h
    mov dx, offset mx
    int 21h
    mov ah, 0ah
    mov dx, offset x
    int 21h
    
     mov ah, 09h
    mov dx, offset my
     int 21h 
     mov ah, 0ah
     mov dx, offset y
    int 21h
  
    mov ah, 0ah
    mov dx,offset inpbuf
    int 21h
    call str2dec
    jc ier
    
    
    call istask1
    jnc  dotask1
    call istask2
    jnc  dotask2
    call istask3
    jnc  dotask3
    
   
    mov ah, 09h
    mov dx, offset ofrange
    int 21h
overflow:
 
    mov ah, 09h
    mov dx, offset mover
    int 21h
  

ier:     
    mov ah, 09h
    mov dx, offset ierror
    int 21h
 
dotask1: 
    mov ah, 09h
    mov dx, offset task1
    int 21h 
    call calc1
    jmp printresult
dotask2: 
     mov ah, 09h
     mov dx, offset task2
    int 21h 
    call calc2
    jmp printresult
dotask3: 
    mov ah, 09h
    mov dx, offset task3
    int 21h
    call calc3
    jmp printresult
 
printresult: 
 mov ah, 09h
     mov dx, offset mres
    int 21h
    call dec2str
     call dec2str
         
    mov ah, 09h
    mov dx, offset mover
    int 21h 
        mov ax,result
        and ax, 1000111111000010b
        call dec2str
    int 20h
 
calc3:  mov ax,4 ; 4*x*x
    cwd
    imul x
    JO overflow3
    imul x
    JO overflow3
    cmp dx,0
    jnz overflow3
    mov v1,ax
    mov ax,y
    cwd
    imul y
    JO overflow3
    cmp dx,0
    jnz overflow3
    mov bx,6
    idiv bx
    mov v2,ax
    add ax,v1
    sub ax,4
    mov result,ax
    ret
overflow3:jmp overflow
 
calc2:  mov ax,6 ; 6*x
    cwd
    imul x
    JO overflow2
    cmp dx,0
    jz skip2
    cmp dx,-1
    jz skip2
    jmp overflow2
skip2:  mov v1,ax
    mov ax,y ; y*y*y/9
    cwd
    imul y
    JO overflow2
    cmp dx,0
    jnz overflow2
    imul y
    JO overflow2
    cmp dx,0
    jz skip20
    cmp dx,-1
    jz skip20
    jmp overflow2
skip20: mov bx,9
    idiv bx
    mov v2,ax
    add ax,v1
    add ax,7
    mov result,ax
    ret
overflow2:jmp overflow
 
calc1:  mov ax,13 ; 13/x/x
    cwd
    idiv x
    cwd
    idiv x
    mov v1,ax
    mov ax,y ; (y*y+1)/2
    imul y
    JO overflow1
    cmp dx,0
    jnz overflow1
    inc ax
    MOV bx,2
    IDIV bx
    mov v2,ax
    add ax,v1
    dec ax
    mov result,ax
    ret
overflow1: jmp overflow
 
istask1:cmp x,11
    jle notask1
    cmp y,3
    jge notask1
    clc
    ret
notask1:stc
    ret
istask2:cmp x,11
    jne notask2
    cmp y,3
    jne notask2
    clc
    ret
notask2:stc
    ret
istask3:cmp x,11
    jge notask3
    cmp y,3
    jle notask3
    clc
    ret
notask3:stc
    ret
str2dec:mov minus,0
    lea si,ibuf2
       mov cx,0
sth1:  lodsb     
       cmp al,13 
       jz sth2
    cmp al,"-"
    jnz sth4
    mov minus,-1
    jmp sth1
sth4:   
       push ax
       mov ax,10 
       mul cx
       mov cx,ax
       pop ax
    
       call todigit 
       jc sth3
       mov ah,0     
       add cx,ax
    adc dx,0
    test cx,8000h 
    jnz sth3
    cmp dx,0
    jnz sth3
       jmp sth1
sth2:  cmp minus,0
    jz sth5
    neg cx
sth5:   clc         
       ret
sth3:  stc         
       ret
 
todigit:cmp al,"0"
    jc notdigit
    cmp al,"9"+1
    jnc notdigit
    sub al,"0"
    clc
    ret
notdigit:mov al,0
    stc
    ret
 

dec2str:
    push ax
    mov di,offset bufout
    mov al,32 
    mov cx,8
    rep stosb 
    pop ax
    mov di,offset bufout
    cmp ax,0 
    jge dec1
    neg ax 
    mov byte ptr [di],"-"
    inc di
dec1:   mov cx,0 
    mov si,10
dec2:   mov dx,0
    div si
    push dx
    inc cx
    cmp ax,0
    jnz dec2
dec3:   pop ax 
    add al,"0"
    stosb
    loop dec3
       
    mov ah, 09h
    mov dx, offset   bufout 
    int 21h
    
    ret
code ends
    end start
alonil вне форума Ответить с цитированием
Старый 22.01.2023, 23:17   #4
alonil
Пользователь
 
Регистрация: 14.01.2023
Сообщений: 38
По умолчанию

Я пытался и вышло как-то так ,но неверно.
alonil вне форума Ответить с цитированием
Старый 22.01.2023, 23:19   #5
macomics
Участник клуба
 
Регистрация: 17.04.2022
Сообщений: 1,833
По умолчанию

Ну да смотрю в книгу, а вижу фигу.

Макрокоманды вам надо убрать. Тогда берете и копируете текст из макрокоманды во все места, где они применяются, подставляя вместо имен параметров фактические значения. Но зачем вам это надо?

Код из #1
Код:
  .model small
    .code
minus   db 0
x   dw 0
y   dw 0
mx  db 13,10,"x=$"
my  db 13,10,"y=$"
v1  dw 0
v2  dw 0
result  dw 0
mres    db "=$"
task1   db 13,10,"Task 1: 13/x/x+(y*y+1)/2-1$"
task2   db 13,10,"Task 2: 6*x+y*y*y/9+7$"
task3   db 13,10,"Task 3: 4*x*x+y*y/6-4$"
ofrange db 13,10,"x or y in illegal range$"
mover   db 13,10,"Multiply overflow$"
; буфер ввода числа (знак -, 5 десятичных цифр, знак конца строки)
inpbuf db 6+1
inplen db 0
ibuf2  db 6+1 dup (0)
ierror  db 13,10,"Input error$"
; буфер вывода 10 ичного числа
bufout db "00000000$"
 
start:  mov ax,cs
    mov ds,ax
    mov es,ax
    push ax
    push dx
    mov dx,offset mx
    mov ah,9
    int 21h
    pop dx
    pop ax
    mov dx,offset inpbuf
    mov ah,10
    int 21h
    call str2dec
    jc ier
    mov x,cx
    push ax
    push dx
    mov dx,offset my
    mov ah,9
    int 21h
    pop dx
    pop ax
    mov dx,offset inpbuf
    mov ah,10
    int 21h
    call str2dec
    jc ier
    mov y,cx
    call istask1
    jnc  dotask1
    call istask2
    jnc  dotask2
    call istask3
    jnc  dotask3
    push ax
    push dx
    mov dx,offset ofrange
    mov ah,9
    int 21h
    pop dx
    pop ax
    int 20h
overflow:    push ax
    push dx
    mov dx,offset mover
    mov ah,9
    int 21h
    pop dx
    pop ax
    int 20h
ier:    push ax
    push dx
    mov dx,offset ierror
    mov ah,9
    int 21h
    pop dx
    pop ax
    int 20h
 
dotask1:    push ax
    push dx
    mov dx,offset task1
    mov ah,9
    int 21h
    pop dx
    pop ax
    call calc1
    jmp printresult
dotask2:    push ax
    push dx
    mov dx,offset task2
    mov ah,9
    int 21h
    pop dx
    pop ax
    call calc2
    jmp printresult
dotask3:    push ax
    push dx
    mov dx,offset task3
    mov ah,9
    int 21h
    pop dx
    pop ax
    call calc3
    jmp printresult
 
printresult:    push ax
    push dx
    mov dx,offset mres
    mov ah,9
    int 21h
    pop dx
    pop ax
    call dec2str
    int 20h
 
calc3:  mov ax,4 ; 4*x*x
    cwd
    imul x
    imul x
    cmp dx,0
    jnz overflow3
    mov v1,ax
    mov ax,y
    cwd
    imul y
    cmp dx,0
    jnz overflow3
    mov bx,6
    idiv bx
    mov v2,ax
    add ax,v1
    sub ax,4
    mov result,ax
    ret
overflow3:jmp overflow
 
calc2:  mov ax,6 ; 6*x
    cwd
    imul x
    cmp dx,0
    jz skip2
    cmp dx,-1
    jz skip2
    jmp overflow2
skip2:  mov v1,ax
    mov ax,y ; y*y*y/9
    cwd
    imul y
    cmp dx,0
    jnz overflow2
    imul y
    cmp dx,0
    jz skip20
    cmp dx,-1
    jz skip20
    jmp overflow2
skip20: mov bx,9
    idiv bx
    mov v2,ax
    add ax,v1
    add ax,7
    mov result,ax
    ret
overflow2:jmp overflow
 
calc1:  mov ax,13 ; 13/x/x
    cwd
    idiv x
    cwd
    idiv x
    mov v1,ax
    mov ax,y ; (y*y+1)/2
    imul y
    cmp dx,0
    jnz overflow1
    inc ax
    shr ax,1
    mov v2,ax
    add ax,v1
    dec ax
    mov result,ax
    ret
overflow1: jmp overflow
 
istask1:cmp x,11
    jle notask1
    cmp y,3
    jge notask1
    clc
    ret
notask1:stc
    ret
istask2:cmp x,11
    jne notask2
    cmp y,3
    jne notask2
    clc
    ret
notask2:stc
    ret
istask3:cmp x,11
    jge notask3
    cmp y,3
    jle notask3
    clc
    ret
notask3:stc
    ret
 
;*******************
 
; ввод CX в 10 ричном виде из строки SI
str2dec:mov minus,0
    lea si,ibuf2
       mov cx,0
sth1:  lodsb     ; читать символ строки
       cmp al,13 ; конец строки ? Выход
       jz sth2
    cmp al,"-"
    jnz sth4
    mov minus,-1
    jmp sth1
sth4:   
       push ax
       mov ax,10 ; cx=cx*10
       mul cx
       mov cx,ax
       pop ax
    
       call todigit ; преобразовать символ в цифру
       jc sth3
       mov ah,0     ; прибавить к cx цифру
       add cx,ax
    adc dx,0
    test cx,8000h ; проверить число на переполнение
    jnz sth3
    cmp dx,0
    jnz sth3
       jmp sth1
sth2:  cmp minus,0
    jz sth5
    neg cx
sth5:   clc          ; норма
       ret
sth3:  stc          ; не норма - неверный символ
       ret
 
; преобразовать символ al в цифру
todigit:cmp al,"0"
    jc notdigit
    cmp al,"9"+1
    jnc notdigit
    sub al,"0"
    clc
    ret
notdigit:mov al,0
    stc
    ret
 
; печать AX в 10 ричном виде
dec2str:
    push ax
    mov di,offset bufout
    mov al,32 ; пробел
    mov cx,8
    rep stosb ; очистить строку буфера
    pop ax
    mov di,offset bufout
    cmp ax,0 ; для отрицательного числа поставить минус и изменить знак
    jge dec1
    neg ax ; ax<0 - добавить минус и поменять знак 
    mov byte ptr [di],"-"
    inc di
dec1:   mov cx,0 ; записать цифры в стек начиная с младшей
    mov si,10
dec2:   mov dx,0
    div si
    push dx
    inc cx
    cmp ax,0
    jnz dec2
dec3:   pop ax ; считать цифры из стека и записать в буфер текста
    add al,"0"
    stosb
    loop dec3
; вывести bufout на печать
    push ax
    push dx
    mov dx,offset bufout
    mov ah,9
    int 21h
    pop dx
    pop ax
    ret
 
    end start
Вроде все поменял

Последний раз редактировалось macomics; 22.01.2023 в 23:22.
macomics вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Найти все четырёхзначные десятичные числа, у которых сумма первых двух цифр в два раза больше суммы правых двух цифр студенточкаБИ Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 26.05.2013 13:26
Форматирование таблицы на основании данных двух первых столбцов blinkheart Microsoft Office Excel 3 10.05.2013 03:31
сумма первых двух положительных элементов массива Valechka Общие вопросы C/C++ 1 09.06.2012 00:45
сумма первых двух положительных элементов массива Valechka Помощь студентам 0 08.06.2012 21:22
Вывод на экран двух первых отрицательных элементов стека kwns Общие вопросы C/C++ 2 26.05.2010 10:57