Написать программу сложения двух 32-разрядных двоичных чисел - Assembler
Формулировка задачи:
День добрый, подскажите почему не могу посмотреть конечный результат(окно закрывается) и почему в конце работы программы выдает "terminated exit code 0". Используется tasm 1.4 for win 7. Все ли правильно и можно ли как-то оптимизировать код?
.MODEL SMALL ;модель оперативной пам¤ти .STACK 100h ;адрес стека .DATA ;сегмент данных программы msg1 db 0dh,0ah, 'Enter A: $' msg2 db 0dh,0ah, 'Enter B: $' msg4 db 0dh,0ah, 'Result: $' ten dd 02h _a dd ? _b dd ? suma dd ? .CODE ;начало сегмента кода .386 start: mov ax,@data mov ds,ax ; загрузка сегментного регистра DS mov ah,09h mov DX,offset msg1 ;ј адрес выводимого сообщения должен быть в DX int 21h ; вывод сообщения mov cx,32 ;разрядность call cgetbin mov [_a], eax mov ah,09h mov DX,offset msg2 ;ј адрес выводимого сообщения должен быть в DX int 21h ; вывод сообщения call cgetbin ; mov [_b], eax add eax, [_a] mov [suma], eax push eax mov ah,09h mov DX,offset msg4 ;ј адрес выводимого сообщения должен быть в DX int 21h ; вывод сообщения pop eax call _cputbin ; pop [suma] mov ax,4c00h ;пересылка 4c00h в регистр ax int 21h ;вызов прерывания с номером 21 ret ; двоичный вывод EAX на консоль _cputbin: ; push eax mov ebx, eax mov cx,32 @B: xor al, al rcl ebx,1 adc al, '0' int 29h loop @B mov al, 'B' int 29h ret ; ввод с консоли двоичного числа с отработкой удаления символа ; на входе: CX - кол-во цифр ; на выходе: EAX - введенное число или -1, если нажат <ESC>, а также CY=1 cgetbin: pushad xor edx, edx mov ebp, edx mov ebx, ecx @l: call getch or al,al jz @l cmp al, 1Bh ; <ESC>? jz cancel cmp al, 0Dh ; <Enter>? jz done cmp al, 08h ; <BkSp>? jnz @4 call rubout jmp @l @4: cmp al, 30h jb @l cmp al, 31h ja @l movzx eax,al ; убираем из eax лишнее shl edx, 1 bt ax,0 adc edx,0 int 29h loop @l ; выход done: mov eax, edx ; or ebp, ebp jz @5 neg eax @5: clc jmp ex ; отмена, взводим Carry(CY), EAX = -1 cancel:; xor eax, eax ; dec eax ; EAX = -1 stc ex: mov ss:[esp+1Ch], eax popad ret ; ; ввод символа getch: xor ax, ax int 16h ret ; нова¤ строка crlf: push ax mov ax, 0A0Dh int 29h xchg al,ah int 29h pop ax ret ; отработка <BkSp> rubout: cmp ebx, ecx ; первый символ? ja @r ; нет test ebp,ebp ; минус вводили? jz @e ; нет dec ebp ; убираем флаг jmp @bs ; стираем "-" с экрана @r: mov eax, edx xor edx, edx idiv dword ptr ten ; делим наше вводимое число на 10. mov edx,eax inc ecx @bs: call bksp @e: ret ; курсор назад на 1 позицию bksp: mov ax, 2008h int 29h xchg ah,al int 29h xchg ah,al int 29h ret end start
Решение задачи: «Написать программу сложения двух 32-разрядных двоичных чисел»
textual
Листинг программы
mov ah,1 int 21h
Объяснение кода листинга программы
ah
- это регистр сегмента данных (DS), который содержит адрес начала стекаint 21h
- это команда для вызова BIOS, в данном случае, для выполнения операции сложения двух 32-разрядных чисел
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д