누군가이 코드를 어떻게 설명 할 수 있습니까? 나는 이것을 이해할 줄 알았지 만 분명히 나는 이해하지 못한다. global main
extern printf
extern scanf
section .data
numberFormat: db '%d', 10, 0
section .text
main:
push r
다른 문자를 밀어 넣는 많은 push 명령어를 작성해야합니다. 나는 그것을 위해 매크로를 사용하고 싶다.이 %macro push_multi 1-* ; Accept between 1 and ∞ arguments
%assign i 1
%rep %0 ; %0 is number of arguments
push %{i}
내 프로그램은 바이너리를 기본 64로 인코딩해야합니다. 모든 것이 EOF까지 작동합니다. 출력 문자열 끝에 '='을 추가하는 데 문제가 있습니다. 이것은 마지막 바이트가 읽혀질 때만 발생해야합니다. 빈 공간을 채워야합니다. 여기에 하나 또는 두 개의 '='를 추가해야 할 때마다 코드를 추출합니다. 내에서 그래서 Read:
mov eax,3
의 개수와베이스 (2)와 그것을 출력의 개수가 좋은 구현 될 것이다 : segment data use32 class=data
number dd 0
format_input db "%d", 0
format_output db "%x", 0
segment code use32 class=code
start:
push dwor
이 프로그램은 사용자가 제공 한 정확도로 pi를 계산해야합니다. calculate_pi() 함수는 NASM으로 작성됩니다. 이 라인은 주석 경우 왜 는 누군가가 나에게 설명 할 수 :는 //printf("accuracy: %.15f\n", precision); //<- This line
이 프로그램은 제대로 작동하지 않습니다. calcuta_pi()
의 샘플 코드에서 나는 다음과 같은 코드를 보았다 : data_segment_size 25과 동일 왜 section .data
db 'hello'
db 'h', 'e', 'l','l','o'
data_segment_size equ $-$$
를? 나는 $와 $$가 무엇을 가리키는 지 알지만이 책이 내 책에 따르면 왜 25인지를
내가 사용자와 "안녕하세요, 여기에 이름이" 이 지금까지 내 코드 인쇄에서 이름을 받아이 간단한 프로그램 몇 가지 문제가 있어요 ... %define SYSCALL_WRITE 0x2000004
%define SYSCALL_EXIT 0x2000001
%define SYSCALL_READ 0x2000003
SECTION .data
prompt
사용자로부터 입력을 얻기 위해 일부 macro을 작성 했으므로 입력을 일부 레지스터에 저장해야합니다. gdb은 저장된 값이 입력과 다른 것을 보여줍니다! 여기 내 코드 : %macro exit 0
mov eax, 1
int 0x80
%endmacro
%macro get_input 0 ; input is a number
push
NASM 어셈블리 코드에서 scanf와의 몇 가지 특별한 동작을 감지합니다. mov rdi, fmt
mov rsi, r14
call _scanf
및 fmt이 같은 data 섹션에 선언 mov rdi, fmt
mov rsi, r15
call _scanf
: : 첫 번째 scanf 전에 section .data
fmt: db "%d", 0
방금 x86 어셈블리를 배우기 시작했고 모든 아스키 문자와 줄 바꿈을 표준 출력으로 인쇄하는 간단한 프로그램을 작성하려고했습니다. 줄 바꿈을 제외하고 예상대로 모든 것을 인쇄하기 때문에 그 이유를 알 수 없습니다. 64 비트 우분투 운영 체제에서 nasm으로 컴파일했습니다. section .data
curr db ' '
section .text