NASM新增计划

时间:2013-09-16 18:24:39

标签: linux nasm

我是一名开发人员,他使用高级语言,在业余时间学习汇编语言。请参阅下面的NASM计划:

section .data

section .bss

section .text
global main
main:
    mov eax,21
    mov ebx,9
    add eax,ebx
    mov ecx,eax
    mov eax,4
    mov ebx,1
    mov edx,4
    int 0x80
push ebp
mov ebp,esp

mov esp,ebp
pop ebp
ret

以下是我使用的命令:

ian @ ubuntu:〜/ Desktop / NASM / Program4 $ nasm -f elf -o asm.o SystemCalls.asm ian @ ubuntu:〜/ Desktop / NASM / Program4 $ gcc -o program asm.o ian @ ubuntu:〜/ Desktop / NASM / Program4 $ ./program

我没有收到任何错误,但终端没有打印任何内容。我使用以下链接确保寄存器包含正确的值:http://docs.cs.up.ac.za/programming/asm/derick_tut/syscalls.html

3 个答案:

答案 0 :(得分:1)

您必须将整数值转换为字符串才能使用sys_write(系统调用4)进行打印。转换可以像这样(未经测试)完成:

; Converts the integer value in EAX to a string in
; decimal representation.
; Returns a pointer to the resulting string in EAX.
int_to_string:
  mov byte [buffer+9],0  ; add a string terminator at the end of the buffer
  lea esi,[buffer+9]
  mov ebx,10             ; divisor      
int_to_string_loop:
  xor edx,edx            ; clear edx prior to dividing edx:eax by ebx
  div ebx                ; EAX /= 10
  add dl,'0'             ; take the remainder of the division and convert it from 0..9 -> '0'..'9'
  dec esi                ; store it in the buffer
  mov [esi],dl
  test eax,eax
  jnz int_to_string_loop    ; repeat until EAX==0
  mov eax,esi
  ret

buffer: resb 10

答案 1 :(得分:0)

汇编编程需要了解ASCII代码和一些基本的转换例程。例如:十六进制到十进制,十进制到十六进制是保存在某个存储上某个地方的好例程。 没有寄存器可以打印,你必须转换(很多)。 为了更有帮助: ASCII 0只打印一些文本编辑器(kde linux中的kate)将在屏幕上显示某些内容(正方形或...)。在更高级别的语言中,如C和C ++,它用于指示NULL指针和字符串结尾。 也可用于计算字符串长度。 10是行尾。取决于Linux或Windows,也会有回车(Linux)(Windows / Dos)。 13是回车 1B是ESC键(Linux用户现在会更多关于此) 255是一个艰难的回归,我从来不知道它为什么有益,但它必须有它的目的。 检查http://www.asciitable.com/是否有整个列表。

答案 2 :(得分:-1)

将整数值转换为字符串。 在这里,我使用宏包和解压缩将整数转换为字符串和宏解压缩,以反之亦然

%macro write 2 
    mov   eax, 4
    mov   ebx, 1
    mov   ecx, %1
    mov   edx, %2
    int   80h
%endmacro

%macro read 2 
    mov eax,3
    mov ebx,0
    mov ecx,%1
    mov edx,%2
    int 80h
%endmacro


%macro pack 3   ;    1-> string ,2->length ,3->variable
    mov esi, %1
    mov ebx,0
    %%l1:
    cmp byte [esi], 10
    je %%exit

    imul ebx,10
    movzx edx,byte [esi]
    sub edx,'0'
    add ebx,edx
    inc esi
    jmp %%l1
    %%exit:
    mov  [%3],ebx
%endmacro

%macro unpack 3    ; 1-> string ,2->length ,3->variable
    mov esi, %1
    mov ebx,0
    movzx eax, byte[%3]
    mov byte[%2],0

    cmp eax, 0
    jne %%l1
    mov byte[%2],1
    push eax
    jmp %%exit2

    %%l1:
    mov ecx,10
    mov edx,0
    div ecx
    add edx,'0'
    push edx
    inc byte[%2]
    cmp eax, 0
    je %%exit2

    jmp %%l1 

    %%exit2:
    movzx ecx,byte[%2]
    %%l2:
    pop edx
    mov [esi],dl
    inc esi
    loop %%l2
%endmacro

section .data       ; data section
msg1:   db "First number : "    ; 
len1:   equ $-msg1      ; 
msg2:   db "Second number : "   ; 
len2:   equ $-msg2      ;                   
msg3:   db "Sum : " ; 
len3:   equ $-msg3      ;   
ln: db 10
lnl: equ $-ln
var1: resb 10
var2: resb 10
str1: resb 10
str2: resb 10
ans: resb 10
ansvar: resb 10
ansl: db ''
l1: db ''
l2: db ''

section.text        ;code
global _start
_start:
    write msg1,len1
    read str1,10      
    pack str1,l1,var1

    write msg2,len2
    read str2,10      
    pack str2,l2,var2    

    mov al,[var1]
    add al,[var2]

    mov [ansvar],al
    unpack ans,ansl,ansvar
    write msg3,len3
    write ans,10
    write ln,lnl

    mov ebx,0       ; exit code, 0=normal
    mov eax,1       ; exit command to kernel
    int 0x80        ; interrupt 80 hex, call kernel

汇编,链接和运行:

nasm -f elf add.asm 
ld -s -o add add.o
./add