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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.12.2014, 14:19   #1
Devil669
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 33
По умолчанию нужно упростить программу

Друзья, выручайте! Есть программа которая вычисляет вес двоичного вектора. Эта программа слишком навороченная(ввод с клавиатуры и т.п.) Как упростить эту программу т.е просто прописываешь в сегменте данных число, и вычисляешь вес без всяких понтов?

Код:
; Сегмент стека
Sseg    SEGMENT STACK   'stack'
    DB  256 DUP (?)
Sseg    ENDS
; Сегмент данных
Dseg    SEGMENT 'data'
    v dw ?
    p db ?
    mess db "Enter the number in b. s.",0Dh, 0Ah,'$'
    mes2 db "Result: ",0Dh, 0Ah,'$'
    err_m db "Incorrect data"
    crlf db       0Dh,0Ah,'$'
    bln  dw ?
    buff db 16
 
Dseg    ENDS
; Сегмент кода
Cseg    SEGMENT 'code'
ASSUME  CS:Cseg, DS:Dseg, SS:Sseg
; Головная подпрограмма
Main    PROC FAR
    ; Подготовимся к возврату в операционную систему
    PUSH    DS
    MOV AX, 0
    PUSH    AX
    ; Настроим DS на наш сегмент данных
    MOV AX, Dseg
    MOV DS, AX
    ; Делаем вычисления
 
 
    mov      ax,0003h
          int      10h  
    mov dx,offset mess
    mov ah,9
    int 21h
    mov       dx,offset buff
          mov       ah,0Ah
          int       21h           ; считать строку символов в буфер
          mov       dx,offset crlf
          mov       ah,9
          int       21h           ; перевод строки
        
         
         ; перевод числа в ASCII-формате из буфера в бинарное число в АХ
        mov ax,0000
        mov       di,0   
        mov       cl,buff+1
        xor       ch,ch
        xor       bx,bx
        mov       si,cx; SI - длина буфера
                         
shx:
        xor ax,ax   
        mov       al,buff+2+di
        sub       al,'0'        ; цифра = код цифры - код символа "0",
        jb        a_er     ; если код символа был меньше, чем код "0",
        cmp       al,1          ; или больше, чем "1",
        ja        a_er     ; выйти из программы с сообщением об ошибке,
        dec cx
        shl       ax,cl
        add       bx,ax        
        inc       di            ; увеличить счетчик
        cmp       di,si         ; если счетчик+1 меньше числа символов -
        jb        shx       ; продолжить (счетчик считается от 0)
        
        mov v,bx
        mov ax,0
        mov cx,10h
Cycle:  test bx,1
        jz ef   
        inc ax
ef:     sar bx,1
        jz ec
        loop Cycle
ec:     mov p,al
        xor ax,ax
        xor bx,bx
        mov       ah,9
        mov       dx,offset mes2
        int       21h
        
        mov bl,48
        mov al,57
        add bl,p
        cmp al,bl
        jnc hex
        add p,55    
        mov al,p
        int 29h
        jmp finish         
hex:    add p,48    
        mov al,p
        int 29h        
        ; Передача управления первому оператору в PSP
finish:   RET
a_er:     mov       dx,offset err_m
    mov       ah,9
          int       21h
    RET
Main    ENDP
Cseg    ENDS
END Main
Devil669 вне форума Ответить с цитированием
Старый 06.12.2014, 15:25   #2
Devil669
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 33
По умолчанию

Хорошо, давайте я помогу. Я понимаю что должна быть вот эта часть(правда не уверен полностью ли)

Код:
shx:
        xor ax,ax   
        mov       al,buff+2+di
        sub       al,'0'        ; цифра = код цифры - код символа "0",
        jb        a_er     ; если код символа был меньше, чем код "0",
        cmp       al,1          ; или больше, чем "1",
        ja        a_er     ; выйти из программы с сообщением об ошибке,
        dec cx
        shl       ax,cl
        add       bx,ax        
        inc       di            ; увеличить счетчик
        cmp       di,si         ; если счетчик+1 меньше числа символов -
        jb        shx       ; продолжить (счетчик считается от 0)
Потому что здесь идет проверка и увеличение счетчика.

Понимаю что должно быть это
Код:
Cycle:  test bx,1
        jz ef   
        inc ax
И это
Код:
ef:     sar bx,1
        jz ec
        loop Cycle
Потому что это цикл и повторение цикла
Но что еще должно быть?
Devil669 вне форума Ответить с цитированием
Старый 07.12.2014, 09:15   #3
Mikl___
Участник клуба
 
Регистрация: 11.01.2010
Сообщений: 1,139
По умолчанию

Devil669,
не понятно до какого предела требуется упростить программу
  1. для начала упростим саму программу
    Код:
    ; masm dos exe #
    .286
    .model small
    .STACK  256
    .data
    p db ?
    mess db "Enter the number in b. s."
    crlf db 0Dh, 0Ah,'$'
    mes2 db "Result: $"
    err_m db "Incorrect data"
    buff db 17,19 dup(?)
    .code
    Main: 	MOV AX,@data
    	MOV DS,AX
        ; Делаем вычисления 
        	mov ax,3
        	int 10h  
        	mov dx,offset mess
        	mov ah,9
        	int 21h
        	mov dx,offset buff
        	mov ah,0Ah
        	int 21h           ; считать строку символов в буфер
    	mov dx,offset crlf
    	mov ah,9
    	int 21h           ; перевод строки            
             ; перевод числа в ASCII-формате из буфера в бинарное число в BХ
            mov si,offset buff+2
            mov cl,buff+1
            xor ch,ch
            xor bx,bx
            mov ah,0
    shx:    lodsb
            sub al,'0'        ; цифра = код цифры - код символа "0",
            cmp al,1          ; или больше, чем "1",
            ja  a_er     ; выйти из программы с сообщением об ошибке,
            shl bx,1
    	add bx,ax
    	loop shx       ; продолжить (счетчик считается от 0)
            mov ax,0
            mov cx,16
    Cycle:  sar bx,1
            adc ax,0
            loop Cycle
    ec:     mov p,al
            mov ah,9
            mov dx,offset mes2
            int 21h
    	mov ah,0
            mov al,p
    	aam
    	ror ax,8
    	or ax,'00'
            int 29h
    	mov al,ah
    	int 29h
            jmp a1
    a_er:   mov dx,offset err_m
        	mov ah,9
            int 21h
    a1:	mov ah,0
    	int 16h
        	mov ah,4Ch
    	int 21h
    END Main
  2. теперь выкинем ввод с клавиатуры, пусть строка символов уже в памяти
    Код:
    ; masm dos exe #
    .286
    .model small
    .STACK  256
    .data
    p db ?
    mess db "Enter the number in b. s."
    crlf db 0Dh, 0Ah,'$'
    mes2 db "Result: $"
    err_m db "Incorrect data"
    buff db 16,16,'1110011111011111'
    .code
    Main: 	MOV AX,@data
    	MOV DS,AX
        ; Делаем вычисления 
        	mov ax,3
        	int 10h  
    ;    	mov dx,offset mess
    ;    	mov ah,9
    ;    	int 21h
    ;    	mov dx,offset buff
    ;    	mov ah,0Ah
    ;    	int 21h           ; считать строку символов в буфер
    ;	mov dx,offset crlf
    ;	mov ah,9
    ;	int 21h           ; перевод строки            
    ;         ; перевод числа в ASCII-формате из буфера в бинарное число в BХ
            mov si,offset buff+2
            mov cl,buff+1
            xor ch,ch
            xor bx,bx
            mov ah,0
    shx:    lodsb
            sub al,'0'        ; цифра = код цифры - код символа "0",
    ;        cmp al,1          ; или больше, чем "1",
    ;        ja  a_er     ; выйти из программы с сообщением об ошибке,
            shl bx,1
    	add bx,ax
    	loop shx       ; продолжить (счетчик считается от 0)
            mov ax,0
            mov cx,16
    Cycle:  sar bx,1
            adc ax,0
            loop Cycle
    ec:     mov p,al
            mov ah,9
            mov dx,offset mes2
            int 21h
    	mov ah,0
            mov al,p
    	aam
    	ror ax,8
    	or ax,'00'
            int 29h
    	mov al,ah
    	int 29h
    ;        jmp a1
    ;a_er:   mov dx,offset err_m
    ;    	mov ah,9
    ;        int 21h
    a1:	mov ah,0
    	int 16h
        	mov ah,4Ch
    	int 21h
    END Main
  3. теперь пусть число в шестнадцатеричном виде находится в регистре ВХ
    Код:
    ; masm dos exe #
    .286
    .model small
    .STACK  256
    .data
    p db ?
    ;mess db "Enter the number in b. s."
    ;crlf db 0Dh, 0Ah,'$'
    mes2 db "Result: $"
    .code
    Main: 	MOV AX,@data
    	MOV DS,AX
        ; Делаем вычисления 
        	mov ax,3
        	int 10h  
    ;        mov si,offset buff+2
    ;        mov cl,buff+1
    ;        xor ch,ch
    ;        xor bx,bx
    ;        mov ah,0
    ;shx:    lodsb
    ;        sub al,'0'        ; цифра = код цифры - код символа "0",
    ;        shl bx,1
    ;	add bx,ax
    ;	loop shx       ; продолжить (счетчик считается от 0)
    	mov bx,0FF0Eh
            mov ax,0
            mov cx,16
    Cycle:  sar bx,1
            adc ax,0
            loop Cycle
    ec:     mov p,al
            mov ah,9
            mov dx,offset mes2
            int 21h
    	mov ah,0
            mov al,p
    	aam
    	ror ax,8
    	or ax,'00'
            int 29h
    	mov al,ah
    	int 29h
    a1:	mov ah,0
    	int 16h
        	mov ah,4Ch
    	int 21h
    END Main
Mikl___ вне форума Ответить с цитированием
Старый 07.12.2014, 19:10   #4
Devil669
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 33
По умолчанию

Круто! Спасибо! Именно так я и хотел.
Devil669 вне форума Ответить с цитированием
Старый 07.12.2014, 19:18   #5
Devil669
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 33
По умолчанию

Только один вопрос. Почему чтобы я не записал в "p" в "mes2" всегда выводится 52h?
Devil669 вне форума Ответить с цитированием
Старый 07.12.2014, 20:44   #6
vadimych
Форумчанин
 
Регистрация: 16.01.2011
Сообщений: 325
По умолчанию

Цитата:
Сообщение от Devil669 Посмотреть сообщение
Почему чтобы я не записал в "p" в "mes2" всегда выводится 52h?
Потому что в bx всегда 0FF0Eh.
vadimych вне форума Ответить с цитированием
Старый 07.12.2014, 21:06   #7
Devil669
Пользователь
 
Регистрация: 20.12.2011
Сообщений: 33
По умолчанию

Цитата:
Сообщение от vadimych Посмотреть сообщение
Потому что в bx всегда 0FF0Eh.
Прошу прощения, не совсем догоняю. Почему в bx всегда 0FF0Eh? Можно ли в bx положить другое число?
Devil669 вне форума Ответить с цитированием
Старый 08.12.2014, 00:48   #8
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,708
По умолчанию

начните читать вам же написали
Цитата:
теперь пусть число в шестнадцатеричном виде находится в регистре ВХ
p51x вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Нужно упростить (не сократить) задачу. PascalAbc. AntoshkaK Паскаль, Turbo Pascal, PascalABC.NET 13 04.12.2011 02:26
упростить программу cherry097 Помощь студентам 4 15.11.2010 18:52
Нужно упростить, переделать формулу avtopark Microsoft Office Excel 3 06.02.2010 10:32
Нужно переделать программу - упростить lukoie Фриланс 14 29.01.2010 01:09