英特尔ASM添加到EAX

时间:2014-01-07 21:56:51

标签: assembly add nasm intel mov

我对ASM很新。我正在运行ARCH linux 64位并使用以下命令进行编译,一切运行顺利:

nasm -f elf32 -o file.o file.asm
ld -s -m elf_i386 -o file file.o

我正在接受用户输入(作为小数),我只是想加倍它。但是,当我使用:

add eax, eax

我没有输出。然后我尝试了:

add eax, 1

哪个应该添加1到eax。但是,这会将内存地址加1。我的.bss部分保留了10个字节。

当我输入“1234”时,它输出“234”(移位+1字节)而不是“1235”

.bss部分:

    i: resd 
    j: resd 10

完整陈述:

    mov eax, 3 ;syscall
    mov ebx, 2 ;syscall
    mov ecx, i ;input variable
    mov edx, 10 ;length of 'i'
    int 0x80 ;kernel call

    mov eax, i ;moving i into eax
    add eax, 0x1 ;adding 1 to eax
    mov [j], eax ;moving eax into j

1 个答案:

答案 0 :(得分:0)

您正在操作的是数字的字符串表示。

您可能需要:

  1. 将字符串转换为数字
  2. 加倍数
  3. 将结果数字转换回字符串
  4. 类似于(未经测试的代码):

    mov esi,i ; get address of input string
    ; convert string to a number stored in ecx
    xor ecx,ecx ; number is initially 0
    loop_top:
    mov bl,[esi] ; load next input byte
    cmp bl,0 ; byte value 0 marks end of string
    je loop_end
    sub bl,'0' ; convert from ASCII digit to numeric byte
    movzx ebx,bl ; convert bl to a dword
    mov eax,10 ; multiply previous ecx by 10
    mul ecx
    mov ecx,eax
    add ecx,ebx ; add next digit value
    inc esi ; prepare to fetch next digit
    jmp loop_top
    loop_end:
    ; ecx now contains the number
    add ecx,ecx ; double it
    ; to do: convert ecx back to a string value
    

    Page 22 of this document包含atoi函数的NASM实现。