32位英特尔组件比较和跳跃



这看起来应该可以工作,但是在输入值后,我总是收到分段错误。有什么建议吗?

.section .data
speed: .int 0
fine: .int 0
points: .int 0
inputPrompt: .asciz "Enter an integer value for speed ==> "
outputPrompt: .asciz "With a speed of %d the fine will be $%d and %d points will be added to your license"
inputSpec: .ascii "%d"

.section .text #read in values
.globl main
main: 
    nop
    pushl   $inputPrompt
    call    printf
    addl    $4, %esp
#read in speed value    
    pushl   $speed
    pushl   $inputSpec
    call scanf
    addl    $8, %esp
#-------------------greater than or equal to 86--------------------------
movl    speed,   %eax
subl    $85,     %eax   
Jg  fine4
#-------------------81 - 85---------------------------------------------
movl    speed,   %eax
subl    $80,     %eax
Jg  fine3
#-------------------76 - 80---------------------------------------------
movl    speed,   %eax
subl    $75,     %eax   
Jg  fine2
#-------------------71 - 75---------------------------------------------
movl    speed,   %eax
subl    $70,     %eax   
Jg  fine1
#-----------------less than 71-----------------------------------------------
movl    $0,     fine
movl    $0,     points
JMP output
 #---------------------71 - 75-------------------------------------------
fine1:
movl    $60,        fine
movl    $2,     points
JMP output
#---------------------76 - 80-------------------------------------------
fine2:
movl    $90,        fine
movl    $3,     points
JMP output
#---------------------81 - 85-------------------------------------------
fine3:
movl    $120,       fine
movl    $4,     points
JMP output
#---------------------less than or equal to 86------------------------------------------
fine4:
movl    $150,       fine
movl    $6,     points
#----------------------------------------------------------------
output:
pushl   points
pushl   fine
pushl   speed
pushl   outputPrompt
call printf
addl $8, %esp
#-----------------------------------------------------------------
call exit

您在pushl outputPrompt中缺少$符号。该指令将outputPrompt的前 4 个字节放在堆栈上,但您需要地址。因此使用pushl $outputPrompt

此外,学习使用调试器,以便可以修复自己的错误。

最新更新