チュートリアルのレッスンやここでのコードは、理解できません。誰か助けてくれますか?私はあなたの助けを感謝します。スタックでnasmを押してポップアップする
最初に関数sprintが呼び出され、 'sprint'関数でedx、ecx、ebx、eaxがスタックにプッシュされ、関数 'slen'が呼び出され、 ebxはスタックにプッシュされますが、私はこのステップを理解していません。ebxはすでにスタック上にあります。私は、ebxがsprint関数が呼び出された後のスタックの2番目の最後のスタックであることを知っています。 ここに2つのスタックがあるのでしょうか?または 誰かが私のために説明できますか?私はとても感謝しています。
最高点
functions.asm
;------------------------------------------
; int slen(String message)
; String length calculation function
slen:
push ebx
mov ebx, eax
nextchar:
cmp byte [eax], 0
jz finished
inc eax
jmp nextchar
finished:
sub eax, ebx
pop ebx
ret
;------------------------------------------
; void sprint(String message)
; String printing function
sprint:
push edx
push ecx
push ebx
push eax
call slen
mov edx, eax
pop eax
mov ecx, eax
mov ebx, 1
mov eax, 4
int 80h
pop ebx
pop ecx
pop edx
ret
;------------------------------------------
; void exit()
; Exit program and restore resources
quit:
mov ebx, 0
mov eax, 1
int 80h
ret '
BLOCKQUOTE のHelloWorld-inc.asm
; Hello World Program (External file include)
; Compile with: nasm -f elf helloworld-inc.asm
; Link with (64 bit systems require elf_i386 option): ld -m elf_i386 helloworld-inc.o -o helloworld-inc
; Run with: ./helloworld-inc
%include 'functions.asm' ; include our external file
SECTION .data
msg1 db 'Hello, brave new world!', 0Ah ; our first message string
msg2 db 'This is how we recycle in NASM.', 0Ah ; our second message string
SECTION .text
global _start
_start:
mov eax, msg1 ; move the address of our first message string into EAX
call sprint ; call our string printing function
mov eax, msg2 ; move the address of our second message string into EAX
call sprint ; call our string printing function
call quit ; call our quit function
関数は、関数または関数が使用するすべてのレジスタを保存する必要があります。 –
なぜこれをCでタグ付けしましたか?私はアセンブリしか見ることができません。 – klutt
しかし、sprintが呼び出された後、すでにebxがスタックにプッシュされていて、関数 'slen'で再びスタックにプッシュされるので、スタック上に2つのebxがあることを意味しますか?私はそれに興味がありません:( – khaco