组装 x86 Linux 不读取特定部分的用户输入

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

读取用户输入的初始系统调用工作得很好,但由于某种原因,当我稍后在代码中调用第二次读取时,它无法正常工作。它只是在让用户输入值之前终止程序。我已在代码中两个问题区域的位置添加了注释。这是代码:

bits 64

global  _start

section .text
  _start: 
    ;Setting
    mov          rax, 1
    mov          rsi, unit
    mov          rdx, unitlen
    syscall

    mov          rax, 0
    mov          rsi, unitre ; assigns unitre in memory
    mov          rdx, 1
    syscall

    mov        al, [unitre] ; gets the value of the first character through pointing at unitre 
                            ; which is the first pointer of the string 
    cmp          al, 'q'
    je           exit

    cmp          al, 'c'
    je           _cels

    cmp          al, 'f'
    je           _fahr

    jmp exit

  _cels:
    mov          rax, 1
    mov          rdi, 1
    mov          rsi, numC
    mov          rdx, numClen
    syscall

    ; Problem area pt. 1
    mov          rax, 0
    mov          rdi, 1
    mov          rsi, numre
    mov          rdx, 1
    ;int 0x80

    jmp        _start
    ;convert numre to degrees fahrenheit
    mov          rax, [numre]
    imul         rax, 9
    mov          rbx, 5
    idiv         rbx
    add          rax, 32

    mov          rax, 1
    mov          rdi, 1
    mov          rsi, numre
    mov          rdx, numrelen
    syscall

    mov          rsi, deg
    mov          rdi, 1
    mov          rdx, degl
    syscall

    ;jmp        _start
  _fahr:
    mov          rax, 1
    mov          rdi, 1
    mov          rsi, numF
    mov          rdx, numFlen
    syscall

    ; Problem area pt. 2
    mov          rax, 0
    mov          rdi, 1
    mov          rsi, numre
    mov          rdx, numrelen
    syscall

    jmp        _start

    ; Convert numre to degrees celsius
    mov          rax, [numre]
    sub          rax, 32
    imul         rax, 5
    mov          rbx, 9
    idiv         rbx

    mov          rax, 1
    mov          rdi, 1
    mov          rsi, numre
    mov          rdx, numrelen
    syscall

    mov          rsi, deg
    mov          rdi, 1
    mov          rdx, degl
    syscall

    ;jmp         _start
  exit:
    ;Exits program
    mov          rax, 60
    xor          rdi, rdi
    syscall

section   .data
  ;Conversion
  unit:      db      "Unit ('c' for Celsius or 'f' for Fahrenheit): ", 10
  unitlen:      equ      $      -      unit
  unitre:      db      "", 10
  numC:      db      "Degrees(C): ", 10
  numClen:      equ      $      -      numC
  numF:      db      "Degrees(F): ", 10
  numFlen:      equ      $      -      numF
  numre:      db      "", 0
  numrelen:      equ      $      -      numre
  deg:        db        "degrees", 10
  degl:      equ      $      -      deg

  ;testing
  num1      db      1

我尝试让用户输入给定的温度值以转换为摄氏度或华氏度。我的方式应该可以工作,但是在让用户输入度数之前(C 或 F,取决于他们在初始提示中输入的内容),程序只是跳过系统调用并移回开始处(我放置了“jmp _start”在“_fahr”和“_cels”中读取系统调用之后,以帮助调试)。

assembly input x86 x86-64 nasm
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.