Assembly elf intel 32输出不打印

Assembly elf intel 32输出不打印,assembly,output,system-calls,elf,Assembly,Output,System Calls,Elf,您好,我对汇编非常陌生,目前正在尝试制作自己的计算器。我知道了如何进行这些操作,它似乎可以工作,但我对代码的“resultat”部分有一些问题 根据我选择的操作,输出是不一样的,我真的不明白为什么 如果我选择进行加法,它将输出结果,但不是我想要在“leresultate est:”之前的短语:如果我选择平方根(sqrt),它将不会输出任何东西 我试图调试它,但我真的很不擅长,我不明白为什么它不能工作。我真的不知道代码的哪一部分造成了这种混乱,所以我将链接整个代码 我真的很好奇为什么它不起作用,如

您好,我对汇编非常陌生,目前正在尝试制作自己的计算器。我知道了如何进行这些操作,它似乎可以工作,但我对代码的“resultat”部分有一些问题

根据我选择的操作,输出是不一样的,我真的不明白为什么

如果我选择进行加法,它将输出结果,但不是我想要在“leresultate 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
我不明白为什么它不起作用

mov-eax,系统写入
mov ebx,标准输出
mov ecx,msg3

mov ebx,lenmsg3#为什么字符串用
dw
声明?ASCII字符每个是1个字节,而不是1个字。
CMPECx,0x00000a31
是一种相当乏味的处理方式。只需编写
cmpcl,'1'
。另外,如果
jmp exit
是下一行代码,中间没有指令或数据,那么
jmp exit
之类的事情就毫无意义了。您还可以对使用
resb 2
声明的变量进行4字节读写。您似乎忽略了
div r/m32
的红利是
edx:eax
(即,您需要在除法之前清除
edx
,以避免溢出)。看起来这只是一个寄存器名的输入错误
strace./a.out
是一个很好的调试工具:跟踪系统调用和解码arg将捕获arg传递寄存器中实际没有正确值的情况。谢谢修复了这个小错误并重新编译了它,但它仍然不起作用。它现在打印我想要的消息(le resultat est:),但不打印结果。还有其他想法吗?@Pancake您应该修复评论中确定的所有其他问题,如果仍然不起作用,请使用更新的来源提出新问题。
mov eax,SYS_WRITE
mov ebx,STDOUT
mov ecx,msg3
mov ebx,lenmsg3    # <<<--- overwrites EBX, EDX intended
int 0x80