如何在NASM中使用scanf?

use*_*532 14 assembly nasm

我正在试图弄清楚如何使用scanf来获取用户输入.我知道要使用printf:我所要做的就是将我想要在屏幕上写入的数据推送到堆栈中,如下所示:

global _main
extern _printf
extern _scanf

section .data
msg db "Hi", 0

section .text
_main:
  push ebp
  mov ebp, esp  

  push msg
  call _printf

  mov esp, ebp
  pop ebp
ret
Run Code Online (Sandbox Code Playgroud)

但我无法弄清楚如何使用scanf.有人可以给我一个最简单的源代码scanf吗?我真的只想把用户输入的内容放入其中.

我不习惯32位大会.我只使用16位,我知道在16位(DOS)你可以这样做:

mov ah, 3fh
mov dx, input
int 21h

input rb 100d
Run Code Online (Sandbox Code Playgroud)

无论你键入什么,都会放在"输入"的地址.

Pre*_*gha 16

我发现这是'在NASM.PDF中编程'

; add1.asm
SECTION .data
    message1: db "Enter the first number: ", 0
    message2: db "Enter the second number: ", 0
    formatin: db "%d", 0
    formatout: db "%d", 10, 0 ; newline, nul terminator
    integer1: times 4 db 0 ; 32-bits integer = 4 bytes
    integer2: times 4 db 0 ;
SECTION .text
   global _main 
   extern _scanf 
   extern _printf     

_main:

   push ebx ; save registers
   push ecx
   push message1
   call printf

   add esp, 4 ; remove parameters
   push integer1 ; address of integer1 (second parameter)
   push formatin ; arguments are right to left (first parameter)
   call scanf

   add esp, 8 ; remove parameters
   push message2
   call printf

   add esp, 4 ; remove parameters
   push integer2 ; address of integer2
   push formatin ; arguments are right to left
   call scanf

   add esp, 8 ; remove parameters

   mov ebx, dword [integer1]
   mov ecx, dword [integer2]
   add ebx, ecx ; add the values          ; the addition
   push ebx
   push formatout
   call printf                            ; call printf to display the sum
   add esp, 8                             ; remove parameters
   pop ecx
   pop ebx ; restore registers in reverse order
   mov eax, 0 ; no error
   ret
Run Code Online (Sandbox Code Playgroud)

这是C函数的asm版本:

#include <stdio.h>
int main(int argc, char *argv[])
{
    int integer1, integer2;
    printf("Enter the first number: ");
    scanf("%d", &integer1);
    printf("Enter the second number: ");
    scanf("%d", &integer2);
    printf("%d\n", integer1+integer2);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)


mat*_*szb 6

谢谢普雷特。我根据你的代码做了一个简单的例子来说明scanf的使用。

请求一个整数并将其打印到屏幕上的程序:

section .text
  global main
  extern printf
  extern scanf

section .data
  message: db "The result is = %d", 10, 0
  request: db "Enter the number: ", 0
  integer1: times 4 db 0 ; 32-bits integer = 4 bytes
  formatin: db "%d", 0

main:
  ;  Ask for an integer
  push request
  call printf
  add esp, 4    ; remove the parameter

  push integer1 ; address of integer1, where the input is going to be stored (second parameter)
  push formatin ; arguments are right to left (first  parameter)
  call scanf
  add esp, 8    ; remove the parameters

  ; Move the value under the address integer1 to EAX
  mov eax, [integer1]

  ; Print out the content of eax register
  push eax
  push message
  call printf
  add esp, 8

  ;  Linux terminate the app
  MOV AL, 1
  MOV EBX, 0 
  INT 80h 
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

28861 次

最近记录:

6 年,10 月 前