1. ホーム
  2. assembly

[解決済み] NASMでscanfを使うには?

2022-02-04 18:59:59

質問内容

をどのように使うか考えています。 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

しかし、どのようにしたら scanf . どなたか、できるだけ簡単なソースコードで scanf ? 私は本当にユーザーが入力したものを置きたいだけです。

32bitのAssemblyに慣れていない。16bitしか使ったことがないのですが、16bit(DOS)ではこうすればいいんですね。

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

input rb 100d

そして、あなたが入力したものはすべて、"input."のアドレスに置かれます。

解決方法は?

私はこれを見つけた '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

これはこの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;
}