我正在学习低级的东西,我试图编写并执行一个简单的程序,它打印输入字符的ASCII码。
section .bss
i resb 1
o resb 8
; i for input, o for output
section .text
global _start
_start:
mov eax, 3
mov ebx, 0
mov ecx, i
mov edx, 1
int 0x80
; get one char
mov ecx, o
add ecx, 7
mov edx, 0
; set ECX point at last of 8 bytes labeled o
while:
mov al, [i]
mov bl, 0
cmp al, bl
jz end
mov bl, 10
div bl
add ah, '0'
mov [i], al
mov [ecx], ah
dec ecx
inc edx
jmp while
end:
; algo - to decimal
mov eax, 4
mov ebx, 1
int 0x80
; ECX ready - was decremented until highest non-zero digit in loop
; so is EDX - incremented digit count times
mov eax, 1
mov ebx, 0
int 0x80
成功编译(nasm)和链接(ld),但在运行时:
Floating point exception (core dumped)
一旦已经修复(实际上是0而不是10),它运作良好,但只是中间测试(按相反顺序打印数字)。然后我保留了8字节的字段来累积循环计算,直到左边,然后中断4,1,..,..结束后,又让我有了一些有趣的CPU内容。
Raping Google没有给出任何结果。怎么了?提前谢谢。
UPD:如果你因为核心转储异常的严重问题而探索关于这个主题的SOF问题,不要在这个话题上浪费你的时间,在我的情况下,我脑子里发生了一个史诗般已经解决的问题,做了一些学校 - 错误。答案 0 :(得分:1)
将mov al, [i]
替换为movzx ax, [i]
您在ah
中至少留下0x30,这会导致ax
> = 0x3000,从而阻止ax
和10之间的分割结果适合al
。
ah
不为零,因为div bl
设置它(它是除法的余数)但是在循环跳回后它永远不会被清除。
这也意味着第一次迭代是偶然的:ah
最初为零,因为SYS_READ
为3,因此在输入循环之前所需的mov eax, 3
将ah
设置为零。
另外,您没有正确设置要打印的字符串的起始地址(它总是少一个字节)。