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

时间:2012-10-12 00:44:18

标签: assembly intel 32-bit

这看起来应该可行,但我在输入值后立即收到分段错误。有什么建议吗?

.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

1 个答案:

答案 0 :(得分:1)

您错过了$的{​​{1}}登录信息。该指令将pushl outputPrompt的前4个字节放在堆栈上,但是您需要该地址。因此,请使用outputPrompt

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