Калькулятор на языке ассемблера
У меня есть проект, с которым я боролся. Половина моей программы работает, а другая половина-нет, но никаких ошибок нет.Процессы A и B работают, но C D и E-нет. Может кто-нибудь мне помочь? Вот что я пытаюсь сделать
Performance Requirements Write a program that will perform as a binary calculator. The program should begin by prompting the user for his or her name. The program should then prompt the user to choose from a set of options for calculations. These options should include 1) adding two binary numbers (answer in binary), 2) subtracting two binary numbers (answer in binary), 3) writing out a decimal number in its binary form, 4) convert a character to uppercase, and 5) reverse the case of an alphabetic character (if entered character is lowercase, then write out uppercase and vice versa) The program should prompt the user for the relevant inputs and perform the correct operation. The program should then display the results as blue text on a white background with the user’s name (For example, "Dr. Rogers, your sum is 100") Coding requirements Create a procedure for each operation. Bonus – For extra credit, implement the following Modify your code to display the formatted results in a message box. Checklist is on the next page.
Вот мой код:
INCLUDE Irvine32.inc BUFMAX = 128 .data CaseTable BYTE 'A' DWORD Process_A BYTE 'B' DWORD Process_B BYTE 'C' DWORD Process_C BYTE 'D' DWORD Process_D BYTE 'E' DWORD Process_E NumberOfEntries = 5 Nameprompt BYTE "Please enter your name: ", 0 prompt BYTE "Choose a letter by pressing the corresponding capital letter: ", 0dh, 0ah BYTE "A: Add two binary numbers", 0dh, 0ah BYTE "B: Subtract two binary numbers", 0dh, 0ah BYTE "C: Writing from decimal number to a binary form", 0dh, 0ah BYTE "D: Converting a character to capital", 0dh, 0ah BYTE "E: Reverse the case of an alphabetic character", 0dh, 0ah, 0 msgA BYTE "Add two binary numbers: ",0 msgB BYTE "Subtract two binary numbers: ",0 msgC BYTE "Writing out a decimal number in its binary form: ", 0 msgD BYTE "Convert a character to an uppercase: ", 0 msgE BYTE "Reverse the case of an alphabetic character: ", 0 prompt1 BYTE "Enter a number: ", 0 prompt2 BYTE "Enter lowercase letter: ", 0 prompt3 BYTE "Enter a lowercase or capital letter: ", 0 promptAdd BYTE ", the binary sum is: ", 0 promptSub BYTE ", the binary difference is: ", 0 promptCon BYTE ", the binary number is: ", 0 promptUp BYTE ", this is the uppercase letter: ", 0 promptReverse BYTE ", this is the reverse case: ", 0 buffer BYTE BUFMAX+1 DUP(0) bufSize DWORD ? .code main PROC mov edx, OFFSET Nameprompt call WriteString mov ecx, BUFMAX mov edx, OFFSET buffer call ReadString mov bufSize,eax call Crlf mov edx, OFFSET prompt call WriteString call Crlf call ReadChar mov ebx,OFFSET CaseTable mov ecx,NumberOfEntries L1: cmp al,[ebx] jne L2 call NEAR PTR [ebx + 1] call Crlf jmp L3 L2: add ebx,5 loop L1 L3: exit main ENDP Process_A PROC mov edx,OFFSET msgA call WriteString call Crlf call Process_A1 call Process_A2 ret Process_A ENDP Process_A1 PROC mov edx,OFFSET prompt1 call WriteString call ReadInt mov ebx, eax call WriteBinB call Crlf mov edx,OFFSET prompt1 call WriteString call ReadInt mov ecx, eax call WriteBinB call Crlf ret Process_A1 ENDP Process_A2 PROC call Crlf mov ax, blue + (white * 16) call SetTextColor mov edx,OFFSET buffer call WriteString mov edx,OFFSET promptAdd call WriteString add ebx, ecx mov eax, ebx call WriteBinB call Crlf mov eax, white + (black * 16) call SetTextColor ret Process_A2 ENDP Process_B PROC mov edx,OFFSET msgB call WriteString call Crlf call Process_B1 call Process_B2 ret Process_B ENDP Process_B1 PROC mov edx,OFFSET prompt1 call WriteString call ReadInt mov ebx, eax call WriteBinB call Crlf mov edx,OFFSET prompt1 call WriteString call ReadInt mov ecx, eax call WriteBinB call Crlf ret Process_B1 ENDP Process_B2 PROC call Crlf mov eax, blue + (white * 16) call SetTextColor mov edx,OFFSET buffer call WriteString mov edx,OFFSET promptSub call WriteString sub ebx, ecx mov eax, ebx call WriteBinB call Crlf mov eax, red + (black * 16) call SetTextColor ret Process_B2 ENDP Process_C PROC mov edx,OFFSET msgC call WriteString call Crlf mov edx,OFFSET prompt1 call WriteString call ReadInt mov ebx, eax call Crlf mov eax, blue + (white * 16) call SetTextColor mov edx,OFFSET buffer call WriteString mov edx,OFFSET promptCon call WriteString mov eax, ebx call WriteBinB call Crlf mov eax, white + (black * 16) call SetTextColor ret Process_C ENDP Process_D PROC mov edx,OFFSET msgD call WriteString call Crlf mov edx,OFFSET prompt2 call WriteString call ReadChar call WriteChar and al, 11011111b mov bl, al call Crlf mov eax, blue + (white * 16) call SetTextColor mov edx,OFFSET buffer call WriteString mov edx,OFFSET promptUp call WriteString mov eax, 0 mov al, bl call WriteChar call Crlf mov eax, white + (black * 16) call SetTextColor ret Process_D ENDP Process_E PROC mov edx,OFFSET msgE call WriteString call Crlf mov edx,OFFSET prompt3 call WriteString call ReadChar call WriteChar L1: cmp al, 01100001b jl L2 and al, 11011111b mov bl, al jmp L3 L2: or al, 00100000b mov bl, al jmp L3 L3: call Crlf mov eax, blue + (white * 16) call SetTextColor mov edx,OFFSET buffer call WriteString mov edx,OFFSET promptReverse call WriteString mov eax, 0 mov al, bl call WriteChar call Crlf mov eax, white + (blue * 16) call SetTextColor ret Process_E ENDP END main
William Winner
это может помочь, если вы скажете нам, что на самом деле работает, а что нет...это много кода для фильтрации.
Christian Graus
Да, ассемблер-это сложный язык для тех, кто изучает его, чтобы не иметь возможности задать четкий вопрос или рассказать о какой-либо отладке, которую они сделали, прежде чем задать его.
terrable
извините, что я вменяю вам какую-то дополнительную информацию. мой процесс a и b работает но мой процесс c d и e не работает
OriginalGriff
Сборка сложна: вот почему так важно использовать разумные имена для всего и хорошо комментировать это.
L1: cmp al, 01100001b
дл Л2
работает отлично, но объясните это. Почему вы сравниваете с 97-м? Что вы собираетесь делать, если это меньше, чем это? Что должен делать Process_A1? Почему бы не назвать его PromptForAndReadTwoIntegers?