2013-06-19 47 views
1

我正在使用nasm构建一个简单的计算器以显示迄今为止学到的什么... 我正在使用linux。 当我打电话打断80h时,它会打印出我所有的字符串,而不是指定长度的字符串。我该如何解决这个问题?`

SECTION .data 

     AskForCalculationPrompt: db "Choose which operation you want", 0xA, "1. Addition", 0xA, "2.Subtraction", 0xA, "3. Multiplication", 0xA, "4. Division", 0x3 

     FirstOperandPrompt: db "Enter the first operand:", 0xA 

     SecondOperandPrompt: db "Enter the second operand:", 0xA 

     AnswerPrompt: db "The answer is: " 

     AskForCalculationPromptln: equ $-AskForCalculationPrompt 

     FirstOperandPromptln: equ $-FirstOperandPrompt 

     SecondOperandPromptln: equ $-SecondOperandPrompt 

     AnswerPromptln: equ $-AnswerPrompt 

SECTION .bss 

     Choice: resb 1 
     FirstOperand: resd 1 
     SecondOperand: resd 1 
     Answer: resd 1 

SECTION .text 

     ;Make interrupt to ask for a prompt ask for calculation prompt 
     global _start 

     _start: 

     mov eax, 4 ;Specify sys_write call 
     mov ebx, 1 ;Standard output 
     mov ecx, AskForCalculationPrompt 
     mov edx, AskForCalculationPromptln 
     int 80h 
;error happens here. 
     ;Make interrupt to read textfrom keyboard 

     mov eax, 3 ;Sys_read call 
     mov ebx, 0 ;Standard input file descriptor 0 
     mov ecx, Choice 
     mov edx, 1 
     int 80h 

     ;Determine what we inserted 

     mov al, byte [Choice] 
     cmp al, 0x35 
     je _start` 
+0

这可以帮助你一下:http://www.dreamincode.net/forums/topic/286248-nasm-linux-terminal-inputoutput-wint-80h/ – wazy

回答

2

在NASM,$评估在包含表达式的行开头的装配位置。所以,你的代码做的是将所有字符串的长度等于4个标签。为了获得一个字符串的长度.data

SECTION .data 

    AskForCalculationPrompt: db "Choose which operation you want", 0xA, "1. Addition", 0xA, "2.Subtraction", 0xA, "3. Multiplication", 0xA, "4. Division", 0x3 
    AskForCalculationPromptln: equ $-AskForCalculationPrompt 

    FirstOperandPrompt: db "Enter the first operand:", 0xA 
    FirstOperandPromptln: equ $-FirstOperandPrompt 

    SecondOperandPrompt: db "Enter the second operand:", 0xA 
    SecondOperandPromptln: equ $-SecondOperandPrompt 

    AnswerPrompt: db "The answer is: " 
    AnswerPromptln: equ $-AnswerPrompt 
+0

oh zomg ty非常多 – Kelvin

+0

另外,我有问题的问题,如果我想要做一个cmp反对用户输入第二个int80h调用与sys_read,我必须重新加载到eax缓冲区,然后做一个cmp,或者有没有捷径? – Kelvin

+0

您可以在不将缓冲区内容加载到注册表的情况下执行此操作,但必须指定大小。如果你说'al'纳斯姆知道这有多大,但你必须告诉Nasm'cmp byte [choice],0x35'。 –