读取用户输入的初始系统调用工作得很好,但由于某种原因,当我稍后在代码中调用第二次读取时,它无法正常工作。它只是在让用户输入值之前终止程序。我已在代码中两个问题区域的位置添加了注释。这是代码:
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”中读取系统调用之后,以帮助调试)。
也许可以使用Linux系统调用表作为参考 https://chromium.googlesource.com/chromiumos/docs/+/master/constants/syscalls.md