【发布时间】:2013-05-01 17:52:25
【问题描述】:
section .data
bufChar: equ 0
section .bss
bufNum: resb 1
bufMult: resb 1
。 . .
leerNumero:
xor eax,eax
mov [bufNum],eax
add eax,1
mov [bufMult],eax
inicioLeerNumero:
mov edx,1
mov ecx,bufChar
mov ebx,0
mov eax,3
int 80h
cmp byte [ecx + edx - 1],10 ; Segfaults here.
je rLeerNumero
cmp byte [ecx + edx - 1],48
jl noNumero
cmp byte [ecx + edx - 1],57
jg noNumero
sub eax,48
mul word [bufMult]
jo overflow
add [bufNum],eax
jo overflow
mov eax,10
mul word [bufMult]
jo overflow
mov [bufMult],eax
jmp inicioLeerNumero
rLeerNumero:
mov eax,bufNum
ret
noNumero:
mov eax,errorNumero
mov ebx,lErrorNumero
call imprimir
jmp salir
overflow:
mov eax,errorOverflow
mov ebx,lErrorOverflow
call imprimir
jmp salir
这段代码应该可以工作,至少在纸面上是可以的。我需要在不链接 C 库的情况下完全在汇编中完成一些作业,因此我为什么要重新发明轮子并制作一种方法来将控制台中的数字读入 EAX。
我在标有注释的行中有一个神秘的段错误,我看不到我是如何尝试访问未对齐的内存的……关于这怎么可能失败的任何想法?
【问题讨论】:
-
使用
objdump -d obj.o验证mov ecx, bufChar确实加载了地址(而不仅仅是偏移量,或变量的内容。) -
mov ecx,bufChar 正在转换为 mov $0x0,%ecx.... 是否真的试图移动到 0x00000000?
-
我想知道...它是否真的打破了 on mov,或者是指令 EIP 当前指向(这似乎暗示系统调用正确之前)?
-
@Machinarius:这是 GAS/AT&T 语法;源操作数和目标操作数与大多数 x86 汇编器显示它们的方式相反。
mov $0x0, %ecx等价于mov ecx, 0。