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