2011-11-07 19 views
6

这需要在纯装配中完成(即没有库或对C的调用)。在Linux上输出装配整数

我明白问题的实质:需要将整数除以10,将其余的一位数字转换为ASCII,输出该数字,然后用商重复该过程。

但由于某种原因,它只是不工作。我在x86上使用NASM。

这里是我到现在为止(不输出任何东西,但不抛出任何错误汇编其一):

; integer to output is stored in eax 
mov ecx, 10 ; for base 10 

loop: 
div ecx ;EAX contains the quotient, EDX the remainder 

; Do something to EDX to convert it to ASCII, not sure if this is correct 
add edx, '0' 

push eax ;We'll be playing with EAX to output EDX, save EAX to the stack 

mov eax, 4    ; sys_write 
mov ebx, 1    ; to STDOUT 
mov ecx, edx 
mov edx, 1 
int 0x80 

pop eax ;restore EAX 

cmp eax, 0 ;If EAX is 0, our job is done 
jnz loop 

有类似这样的(即this了一些问题和this),但我迷失在执行中。 This question(对于DOS)也很有帮助,但我仍然感到困惑。

我必须在这里失去一些东西。思考?

+0

我没有看到这个代码中的任何地方常量'10',这将是必要的打印出十进制数字。 (你需要用'10'重复'div'和'mod',存储数字,反转并输出它们,或者先从'big end'开始,然后除以'100,000,000',然后'10,000,000'等等 - 但这可能不会比存储和反转方法复杂。) – sarnold

+0

@sarnold忘记在顶部包括一行。编辑我的问题添加它。 –

+0

优秀!感谢更新。 – sarnold

回答

3

还有至少两个问题。除此之外@sarnold提到的ecx腐败:

  1. div ecxecx除以64位值edx:eax,所以你需要确保你的事业部之前设置edx为0。

  2. write系统调用的第二个参数(在ecx中)应该是指向包含要打印的字符的缓冲区的指针,而不是字符本身。解决第二个问题

一种方式是推动寄存器包含要打印堆栈上的字符,然后在最近推项目especx(堆栈指针指向分配堆栈指针,并且x86存储的值很小,所以第一个字节是低8位)。例如

push edx   ; save value on stack 
mov eax, 4  ; sys_write 
mov ebx, 1  ; to STDOUT 
mov ecx, esp ; first byte on stack 
mov edx, 1  ; length = one byte 
int 0x80 
pop edx   ; remove what we pushed (or "add esp, 4" would do just as well here; 
       ;      we don't need the actual value again) 

这应该是足以让一些输出...

(但在这一点上,你可能会发现你的算法的“功能”,并要重新思考如何存储数字这是由部门生产!)

+0

这是一个很好的解释,谢谢澄清。正如你所暗示的那样,我明白为什么这个算法反向输出整数。任何想法修复? –

+1

无论是在数据部分(例如使用'resb'指令)还是在堆栈中(只需从'esp'中减去一些数字(最大无符号32位整数是4294967295,因此10个字节就足够了) ,但要确保你减去4的倍数以保持堆栈正确对齐)。然后或者将数字存储到前进的缓冲区中,然后在反向打印每个字符时遍历缓冲区;或者(更好?)将数字从缓冲区的最后一个字节开始存储到缓冲区并向后工作,然后您可以用一个'write'系统调用写入所有数字。 –

2

你正确设置ecx10在你的日常的顶部,但后来改写ecx

mov eax, 4    ; sys_write 
mov ebx, 1    ; to STDOUT 
mov ecx, edx ;;; oops -- lost the 10 
mov edx, 1 
int 0x80 

尝试移动loop了一条线,所以ecx通过循环重新初始化10每次。

+0

好,赶紧解决吧。我还没有得到任何输出,我的猜测是'add edx,'0''不能正确地将单个数字转换为十进制。 –