Quindi ho la maggior parte del codice funzionante, ma non riesco a capire esattamente come affrontare il fatto che la frase di input è di una lunghezza sconosciuta. Sono nuovo all'assemblaggio e questo è un po 'confuso.Come gestire l'input di lunghezza sconosciuta in ASM x86?
(In questo momento l'ho impostato come se la lunghezza erano noti per essere tre personaggi, ma ovviamente ho bisogno di cambiare la situazione.)
.data
input_msg: .ascii "Enter a random sentence: "
input_msg_len: .long 25
input_str: .ascii "???" # 3rd should get newline
count: .long 0
newline: .long 10
.text
.global _start
_start:
# prompt for input
mov $4, %eax # prompt for input
mov $1, %ebx
mov $input_msg, %ecx
mov input_msg_len, %edx
int $0x80
# get input
mov $3, %eax # 3 to request "read"
mov $0, %ebx # 0 is "console" (keyboard)
mov $input_str, %ecx # input buffer addr
mov $3, %edx # number of symbols typed in
int $0x80 # Go do the service!
again1:
mov $input_str, %ecx
add count, %ecx # count is offset from input_str beginning
mov $4, %eax # to write
mov $1, %ebx # to console display
mov $1, %edx # 1 byte to write
int $0x80 # Do it!
push %ecx # push onto stack
incl count # increment count
cmp $3, count # compare lengths
jnz again1 # jmp again if not 0 (no difference)
mov $0, %edi # use edi as loop counter
mov $4, %eax # print out msg
mov $1, %ebx # etc.
mov $1, %edx # length
int $0x80 # OS, serve!
again2:
pop %ecx
mov $4, %eax # print out msg
mov $1, %ebx # etc.
mov $1, %edx # length
int $0x80 # OS, serve!
inc %edi # increment edi
cmp count, %edi # compare lengths
jnz again2 # jmp again if not 0 (no difference)
# print newline
mov $4, %eax # print out msg
mov $1, %ebx # etc.
mov $newline, %ecx # addr
mov $1, %edx # length
int $0x80 # OS, serve!
# exit
mov $1, %eax # exit
int $0x80 # OS, serve!
In sostanza, quello che voglio sapere è come faccio ottenere il codice per funzionare per qualsiasi frase, piuttosto che solo una lunghezza di 3 caratteri?
Null termina la stringa. O è necessario memorizzare la lunghezza da qualche parte. – nhahtdh
Cos'è l'interrupt $ 80? Penso che questo fosse riservato per la ROM di base. Dovrai dire all'ambiente che stai programmando prima che qualcuno possa aiutarti. – Gene
@Gene Int 80h viene utilizzato dai sistemi unix-like per le chiamate di sistema. È un po 'come Int 21h sotto MS-DOS/Windows. – mjv