elf intel 32输出不打印

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

你好,我对汇编语言很陌生,我目前正在尝试制作自己的计算器。我想出了如何进行操作的方法,它似乎可以正常工作,但是代码的“结果”部分存在一些问题。

取决于我选择进行输出的操作是不一样的,我并不真正理解为什么。

如果我选择加法,它将输出结果,但不会输出我想要的短语,例如:“ le resultat est:”如果我选择平方根(sqrt),它将不会输出任何内容。

我尝试调试它,但是我真的很烂,我不明白为什么它不起作用。我真的不知道代码的哪一部分会造成这种混乱,因此抱歉,我会将整个代码链接起来。

我真的很想知道为什么它不起作用,如果您有一些使我的代码变得更好的一般技巧,我也很高兴阅读它们。

SYS_WRITE equ 4
SYS_READ equ 3
SYS_EXIT equ 1
STDIN equ 0
STDOUT equ 1

section .data
msgchoix dw 'Bonjour veulliez choisir le type de calcul en rentrant 1:addition 2:mul 3:div 4:sqrt 5:log',0xa
lenmsgchoix equ $ - msgchoix
msg1add dw 'Bonjour veuillez choisir un nombre a additionner',0xa
lenmsg1add equ $ - msg1add
msg2add dw 'le deuxieme',0xa
lenmsg2add equ $ - msg2add
msg1mul dw 'premier nombre a multiplier',0xa
lenmsg1mul equ $ - msg1mul
msg2mul dw 'deuxieme nombre',0xa
lenmsg2mul equ $ - msg2mul
msg1div dw "le nombre a diviser",0xa
lenmsg1div equ $ - msg1div
msg2div dw "le diviseur",0xa
lenmsg2div equ $ - msg2div
msg1sqrt dw "le nombre dont vous voulez la racine",0xa
lenmsg1sqrt equ  - msg1sqrt
msg3 dw 'le resultat est : '
lenmsg3 equ $ - msg3
msg4 dw '',0xa

section .bss
choix resb 2
num1 resb 2
num2 resb 2
mid1 resb 2
sum resb 2

section .text
    global _start

_start:
    mov eax,SYS_WRITE
    mov ebx,STDOUT
    mov ecx,msgchoix
    mov edx,lenmsgchoix
    int 0x80

    ;choix du type de calcul

    mov eax,SYS_READ
    mov ebx,STDIN
    mov ecx,choix
    mov edx,2
    int 0x80

    mov ecx,[choix]
    cmp ecx,0x00000a31
    je addition
    cmp ecx,0x00000a32
    je multiplication
    cmp ecx,0x00000a33
    je division
    cmp ecx,0x00000a34
    je sqrt

sqrt :
    mov eax,SYS_WRITE
    mov ebx,STDOUT
    mov ecx,msg1sqrt
    mov edx,lenmsg1sqrt
    int 0x80

    mov eax,SYS_READ
    mov ebx,STDIN
    mov ecx,num1
    mov edx,1
    int 0x80

    mov edx,[num1]

    jmp sqrtcalc

sqrtcalc :

    mov eax,[sum]
    sub eax,'0'
    mov ecx,[num1]
    div ecx
    add ecx,'0'

    add ecx,[sum]

    mov eax,2
    sub eax,'0'
    sub ecx,'0'
    div ecx
    add ecx,'0'

    cmp [sum],ecx
    mov [sum],ecx
    je resultat
    jne sqrtcalc

division :

    mov eax,SYS_WRITE
    mov ebx,STDOUT
    mov ecx,msg1div
    mov edx,lenmsg1div
    int 0x80

    mov eax,SYS_READ
    mov ebx,STDIN
    mov ecx,num1
    mov edx,2
    int 0x80

    mov eax,SYS_WRITE
    mov ebx,STDOUT
    mov ecx,msg2div
    mov edx,lenmsg2div
    int 0x80

    mov eax,SYS_READ
    mov ebx,STDIN
    mov ecx,num2
    mov edx,2
    int 0x80

    ;calcul

    mov ebx,[num1]
    sub ebx,'0'

    mov eax,[num2]
    sub ebx,'0'

    div ebx
    add ebx,'0'
    mov [sum],ebx

    jmp resultat

multiplication:

    mov eax,SYS_WRITE
    mov ebx,STDOUT
    mov ecx,msg1mul
    mov edx,lenmsg1mul
    int 0x80

    mov eax,SYS_READ
    mov ebx,STDIN
    mov ecx,num1
    mov edx,2
    int 0x80

    mov eax,SYS_WRITE
    mov ebx,STDOUT
    mov ecx,msg2mul
    mov edx,lenmsg2mul
    int 0x80

    mov eax,SYS_READ
    mov ebx,STDIN
    mov ecx,num2
    mov edx,2
    int 0x80

    ;calcul

    mov eax,[num1]
    sub eax,'0'

    mov ebx,[num2]
    sub ebx,'0'

    mul ebx
    add eax,'0'
    mov [sum],eax

    jmp resultat

addition :

    mov eax,SYS_WRITE
    mov ebx,STDOUT
    mov ecx,msg1add
    mov edx,lenmsg1add
    int 0x80

    mov eax,SYS_READ
    mov ebx,STDIN
    mov ecx,num1
    mov edx,2
    int 0x80

    mov eax,SYS_WRITE
    mov ebx,STDOUT
    mov ecx,msg2add
    mov edx,lenmsg2add
    int 0x80

    mov eax,SYS_READ
    mov ebx,STDIN
    mov ecx,num2
    mov edx,2
    int 0x80

    ;calcul

    mov eax,[num1]
    sub eax,'0'

    mov ebx,[num2]
    sub eax,'0'

    add eax,ebx
    add eax,'0'
    mov [sum],eax

    jmp resultat

resultat:

    mov eax,SYS_WRITE
    mov ebx,STDOUT
    mov ecx,msg3
    mov ebx,lenmsg3
    int 0x80

    mov eax,SYS_WRITE
    mov ebx,STDOUT
    mov ecx,sum
    mov edx,2
    int 0x80

    mov eax,SYS_WRITE
    mov ebx,STDOUT
    mov ecx,msg4
    mov edx,1
    int 0x80

    jmp exit

exit:
    mov eax,SYS_EXIT
    xor ebx,ebx
    int 0x80
assembly output system-calls elf
1个回答
0
投票

我不明白为什么它不起作用

mov eax,SYS_WRITE
mov ebx,STDOUT
mov ecx,msg3
mov ebx,lenmsg3    # <<<--- overwrites EBX, EDX intended
int 0x80
© www.soinside.com 2019 - 2024. All rights reserved.