Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Asm: Общие вопросы > Помогите с выводом ответа.


Автор: gorom 17.5.2006, 12:00
У меня есть код

mov ax,6
mov bx,4
add ax,bx

как мне вывести результат сложения на экран??? 

Автор: Akina 17.5.2006, 12:57
Код

; This 3 procedures types the content of AX (SAY_16), AL (SAY_8)
; or lower 4-bit part of AL (SAY_B) on screen in HEX digits.



SAY_16         PROC    NEAR
                PUSH    AX
                PUSH    CX
                PUSH    DX
                XOR     DX,DX
                XCHG    AH,DL
                PUSH    AX
                MOV     AX,DX
                CALL    SAY_8
                POP     AX
                CALL    SAY_8
                POP     DX
                POP     CX
                POP     AX
                RETN
SAY_16         ENDP

SAY_8          PROC    NEAR
                PUSH    AX
                PUSH    CX
                PUSH    DX
                XOR     AH,AH
                MOV     CL,4
                SHL     AX,CL
                SHR     AL,CL
                XOR     DX,DX
                XCHG    AH,DL
                PUSH    AX
                CALL    SAY_B
                POP    DX
                CALL    SAY_B
                POP     DX
                POP     CX
                POP     AX
                RETN
SAY_8          ENDP

SAY_B          PROC    NEAR
                MOV     AH,2
                ADD     DL,30H
                CMP     DL,3AH
                JB      SAY_B_
                ADD     DL,7
SAY_B_:        INT     21H
                RETN
SAY_B          ENDP

Соответственно 
Код

CALL SAY_16

выведет в текущую позицию экрана 000А, что соответствует десятичному 10 и равно результату сложения 6 и 4. 

Автор: e-moe 18.5.2006, 21:22
А если нужно выводить в 10с/с то дели на 10 до нулевого результата и выводи в обратном порядке остатки от деления... 

Автор: XSInet 12.6.2006, 12:42
На API можно так:

Код

.data
   Str1  byte  "Ответ: %u",0
   Buf   byte   15 dup (0)
.code
  mov eax, 6
  mov ebx, 4
  add eax, ebx

  push eax
  push offset Str1
  push offset Buf
  call wsprintf

  push 0
  push 0
  push offset Buf
  push 0
  call MessageBoxA
 

Автор: setty 12.6.2006, 16:23
2XSInet  в этом случае вывод будит в дексе, а если вывести надо в хэксе то 
Str1  byte  "Ответ: %x",0 

Автор: BUGOR 12.6.2006, 16:53
Можно так:
Код

.data 
var dw 30h

.code
start:

mov ax,4
mov bx,2
add ax,bx

add var,ax

push 0    
push 0    
push offset var
push 0    
call MessageBoxA

end start
  

Автор: setty 12.6.2006, 18:00
BUGOR это будит работать только для вывода одного символа и только в случае если сумма небольше 9ти )

вот кпримеру если сделать так:

mov ax,5d
mov bx,8d
add ax,bx     ;ax=13d
add var,ax    ; var=61d -> ASCII - "=" 

Автор: XSInet 12.6.2006, 19:02
to setty.
Цитата

2XSInet  в этом случае вывод будит в дексе, а если вывести надо в хэксе то 
Str1  byte  "Ответ: %x",0  


А разве кто-то просил в хексе ? И зачем ты мне это говришь, - не я спрашивал... 

Автор: BUGOR 12.6.2006, 19:42
setty, эта проблема решается довольно просто в цикле, в любом случае считаю прибавление койффицента 30h к каждой фицре более рациональным решением, чем вызов тормозной wsprintfa:)

Добавлено @ 19:47 
PS Стояла задача вывести результат сложения 4+2, моё решение справляется с условия поставленной задачи, поэтому не надо всё усложнятьsmile 

Автор: setty 12.6.2006, 21:18
да я знаю писал както свю функцию для этих целей сонована на той идее что ты предложил

однако вариант с использованием wsprintfa показался мне более симпатичным и я знаю один лиш недостаток - отсутствие явно заданного размера строки что может приводить к переполнениям буфера

есть ли еще какието причины не использовать wsprintf? 

Автор: setty 12.6.2006, 22:35
кстате можно воспользоватся процедурами dw2hex & dw2ah из masm32.lib этих же целей 

Автор: BUGOR 13.6.2006, 09:52
setty, есть ещё одна причина: wsprintf самая тормозная функция из всех, что я встречал. В циклах её вообще никогда не использую, есть более красивые решения. 

Автор: setty 13.6.2006, 12:15
так ты про скорость выпонения? 

Автор: ds29 15.6.2006, 00:46
лучше использовать свою функцию (или не свою но открытый код) чем вызывать  wsprintf из DLL 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)