我正在尝试编写一个 ARM 64 汇编程序来实现 SELECT/CASE 结构

问题描述 投票:0回答:1

我正在创建一个

ARM
汇编语言框架来实现一个
SELECT/CASE
结构。

格式为:

SELECT number
    CASE 1:
        << statements if number is 1 >>
    CASE 2:
        << statements if number is 2 >>
    CASE ELSE:
        << statement if not any other case >>

这是我尝试过的,但程序不会根据输入的数字输出消息:

// Declare program entry point
.global _start

// Messages to be displayed
.data
prompt:     .asciz "Input a number: "  // Prompt message
case1_msg:  .asciz "You entered 1\n"  // Case 1 message
case2_msg:  .asciz "You entered 2\n"  // Case 2 message
else_msg:   .asciz "You entered a value other than 1 and 2\n"  // Else message

.text
_start:
    // Display prompt and get user input
    mov     x0, #0          // Set output to stdout
    adr     x1, prompt      // Load prompt address
    mov     x2, #17         // Set prompt length
    mov     x8, #64         // Call Linux write function
    svc     #0              // Execute system call
    mov     x0, #0          // Set input to stdin
    mov     x8, #63         // Call Linux read function
    svc     #0              // Execute system call

    // Check user input against cases
    cmp     w0, #1          // Compare input with case 1
    beq     case1           // Branch to case 1 if equal
    cmp     w0, #2          // Compare input with case 2
    beq     case2           // Branch to case 2 if equal
    b       else_case      // Branch to else case if not equal to either case

case1:
    // Perform actions for case 1
    adr     x0, case1_msg   // Load case 1 message address
    mov     x8, #64         // Call Linux write function
    svc     #0              // Execute system call
    b       end_select     // Branch to end of case1

case2:
    // Perform actions for case 2
    adr     x0, case2_msg   // Load case 2 message address
    mov     x8, #64         // Call Linux write function
    svc     #0              // Execute system call
    b       end_select     // Branch to end of case2

else_case:
    // Perform actions for else case
    adr     x0, else_msg    // Load else message address
    mov     x8, #64         // Call Linux write function
    svc     #0              // Execute system call

end_select:
    // Terminate program
    mov     x0, #0          // Set return code to 0
    mov     x8, #93         // Call Linux exit function
    svc     #0              // Execute system call
assembly arm arm64
1个回答
0
投票

我设法解决了这个问题。问题是我正在比较一个整数和一个字符。我将字符转换为整数并进行了比较,一切都按预期进行。我感谢所有帮助我找出问题所在的人。 下面是我写的代码。

// Assembler program to implement a SELECT/CASE construct
.global _start // Provide program starting address
_start:
     //Display a message and prompt for input
     mov    X0, #0
     ldr    X1, =prompt // Load address of prompt message
     mov    X2, #74 // length of the prompt message
     mov    X8, #64 // call Linux
     svc    0  //display the message

     //Reading the user input
     mov    X0, #0
     ldr    X1, =input  // Load address of input buffer
     mov    X2, #10     // input size
     mov    X8, #63     // system call
     svc    0           // read input from keyboard

     // From ASCII to integer conversion
     ldrb   W0, [X1]    // load the character
     sub    W0, W0, #'0'// convert to integer
     cmp    W0, #1      // check if the value is 1
     b.eq   print_one   // if true print message for 1
     cmp    W0, #2      // check if it is 2
     b.eq   print_two   // print message for two

    // This will execute if the input is not 1 or 2
     ldr    X1, =unknown// "unknown" message string
     mov    X2, #49 // length of the string
     mov    X0, #1 // 1 = StdOut
     mov    X8, #64 // write system call
     svc    0 // system call to print
     b      exit // move to exit

//this option will be executed if the user enters 1
print_one:
     //print "one" message
     ldr    X1, =one // message string
     mov    X2, #29 // length of the string
     mov    X8, #64 // write system call
     svc    0  // call to output message
     b      exit  // move to exit

print_two:
     // Print "two" message
     ldr    X1, =two // message string
     mov    X2, #29 // lenth of the string
     mov    X8, #64 // write system call
     svc    0  // call to output message
     b      exit  // move to exit

exit:
     // Exiting program
     mov    X0, #0 // Use 0 return code
     mov    X8, #93 // Service code 93 terminates
     svc    0 // Call Linux to terminate

.data
//different messages to be displayed
prompt:  .ascii "Implement a Select/Case structure:\n1. Case 1 actions\n2. Case 2 actions\n"
input:   .skip 10      // Input buffer for read system call
one:     .ascii "case 1 actions will be taken\n"
two:     .ascii "case 2 actions will be taken\n"
unknown: .ascii "input does not match with any case. Else actions\n"
//end of the program

© www.soinside.com 2019 - 2024. All rights reserved.