linux nasm程序集显示输入加1

时间:2012-11-03 05:31:39

标签: linux assembly x86 nasm

我正在解决一些简单的练习问题,其中一个问题是读取一个数字,然后输出该数字加1。

例如:

Please enter a number: 4
5

现在,通过输入和输出,它应该很容易。但我想让我的程序能够处理多个数字。这就是我难倒的地方。因为如果给我999的输入,我的程序如何知道将最后的9设为0,并将数字列加1?然后,怎么知道通过添加另一个数字将数字变成1000?

到目前为止,这是我的代码:

SECTION .data
msg        db "Please enter a number: ",0
msglen     EQU $-msg
sz         EQU 32
NUL        EQU 0
len        EQU 32

SECTION .bss
num        resb len

SECTION .text
GLOBAL _start
_start:

Msg:                             ; display the message
mov        eax, 4
mov        ebx, 1
mov        ecx, msg
mov        edx, msglen 
int        80h              

Read:                            ; read in the number
mov        eax, 3
mov        ebx, 1
mov        ecx, num
mov        edx, len
int        80h


Length:                          ; Find length of string
mov        eax, num
mov        ebx, 0
loop:
cmp        BYTE[eax], NUL
je         Set 
inc        eax
inc        ebx
jmp        loop                               

Set:                             ; set up the registers and variables
mov        ecx, num

Print:                           ; main section - prints out the number plus 1
cmp        BYTE[ecx], NUL
je         Exit 
mov        eax, 4
mov        ebx, 1
mov        edx, 1            ; NOTE- does not yet add 1 to the number
int        80h

inc        ecx
jmp        Print 

Exit:                            ; exits safely
mov        eax, 1
mov        ebx, 0
int        80h  

有人可以告诉我如何解决这个问题吗?我只是无法弄清楚添加部分。我可以打印多个数字,最多32位,但添加只是一个谜。

提前致谢,

Rileyh

1 个答案:

答案 0 :(得分:2)

如何使用atoi()将其转换为整数然后printf()来输出结果?有一些示例代码:

http://cs.lmu.edu/~ray/notes/nasmexamples/

至于你的整数添加问题,如果我是你,我首先将问题撕成“添加一个”。你会注意到你在那里遵循这个算法:

  1. 将指针设置为字符串中的最后一个字符。
  2. 将角色增加一个。如果字符低于ASCII'9',则返回。
  3. 否则,将指针设置为前一个字符。如果它的数字不是-1,则跳转到2。
  4. 如果我们试图覆盖字符编号-1,为新字符串分配n + 1个字节,将旧字符串的内容复制到新字符串中,并将“1”添加为第一个字符。
  5. 从这一点来说,如果你想添加多个输入数字,你只需要弄清楚会有什么变化。