2012-02-14 2 views
0

Я начинаю изучать язык ассемблера. Программа, которую мне нужно сделать, очень проста. 1 - Считать 4-значное число (может быть отрицательным числом) 2 - Вывести номер с введенным номером 3 - Рассчитать/вывести половину введенного номера 4 - Рассчитать/вывести двойной номер введенного номераПроблема с языком ассемблера ... и как вы делаете новую строку?

Итак ... это код ... первая секция данных

section .data ; Data segment 
    msgPrompt  db 'Please enter a number ' ; Ask the user to enter a number 
    lenMsgPrompt equ $-msgPrompt   ; The length of the message 
    msgNumber  db 'The entered number is ' 
    lenMsgNumber equ $-msgNumber     
    msgHalf   db 'The half of the entered number is ' 
    lenMsgHalf  equ $-msgHalf 
    msgDouble  db 'The double of the entered numbered is ' 
    lenMsgDouble equ $-msgDouble 

Тогда неинициализированные данные (для ввода данных пользователя)

section .bss  ; Uninitialized data 
    userNumber resb 5 
    halfNumber resb 5 
    doubleNumber resb 5 

Затем ... сегмент коды , ..

section .text  ; Code Segment 

     global _start 
     _start: 

     ;Prompt the user 
     mov eax, 4 
     mov ebx, 1 
     mov ecx, msgPrompt 
     mov edx, lenMsgPrompt 
     int 80h 

     ; Read and store the user input 
     mov eax, 3 
     mov ebx, 2 
     mov ecx, userNumber 
     mov edx, 5  ; 5 bytes (numeric, 1 for sign) of that information 
     int 80h 

     ; Output the message 'The entered number is ' 
     mov eax, 4 
     mov ebx, 1 
     mov ecx, msgNumber 
     mov edx, lenMsgNumber 
     int 80h 

     ; Output the number entered 
     mov eax, 4 
     mov ebx, 1 
     mov ecx, userNumber 
     mov edx, 5 
     int 80h 

     ; Output the message 'The half of the entered number is ' 
     mov eax, 4 
     mov ebx, 1 
     mov ecx, msgHalf 
     mov edx, lenMsgHalf 
     int 80h 

     ; Calculate the half of the number entered 
     mov eax, [userNumber] 
     shr eax, 1  ; Shift to the right by one bit 
     mov [halfNumber], eax 

     ; Output half of the number entered 
     mov eax, 4 
     mov ebx, 1 
     mov ecx, halfNumber 
     mov edx, 5 
     int 80h 

     ; Output the message 'The double of the entered numbered is ' 
     mov eax, 4 
     mov ebx, 1 
     mov ecx, msgDouble 
     mov edx, lenMsgDouble 
     int 80h 

     ; Calculate the double of the number entered 
     mov ebx, [userNumber] 
     shl ebx, 1  ; Shift the the left by one bit 
     mov [doubleNumber], ebx 

     ; Output double of the number entered 
     mov eax, 4 
     mov ebx, 1 
     mov ecx, doubleNumber 
     mov edx, 5 
     int 80h 

     ; Leave program 
     mov eax, 1 
     mov ebx, 0 
     int 0x80 

Это конечный результат ... Here (не хватает репутации еще размещать изображения ...)

Как вы можете видеть, есть проблема ... Также , Я хотел бы иметь новую строку после «половина номера xxxxx».

Спасибо

ответ

1

Похоже, что вы делаете арифметические на ASCII-кодов для цифр, вместо числового значения.

+0

Ya, это проблема ... как я могу «преобразовать» значение ascii в целочисленное значение? – Triwis

+0

@Triwis: вычтите код ASCII для нуля, который равен «0x30» или 48. Но у вас все еще есть отдельные цифры десятичного числа, поэтому, если вы используете арифметические инструкции, вам все равно нужно беспокоиться о переносах и заимствованиях. Или вы можете преобразовать в двоичный (компьютерный) номер, выполнить арифметику и преобразовать обратно. –

+0

Большое спасибо – Triwis

0

Вам не хватает кодов EOL (13, 10)?

msgHalf   db 'The half of the entered number is ', 13, 10 
Смежные вопросы