NASM Drucken ein Zeichen zu einem Zeitpunkt
Kommen, wie dieses Programm ist nicht ausdrucken auf dem Bildschirm, bin ich etwas fehlt auf der INT 80 Befehl?
section .bss
section .data
hello: db "Hello World",0xa ;10 is EOL
section .text
global _start
_start:
mov ecx, 0; ; int i = 0;
loop:
mov dl, byte [hello + ecx] ; while(data[i] != EOF) {
cmp dl, 0xa ;
je exit ;
mov ebx, ecx ; store conetents of i (ecx)
; Print single character
mov eax, 4 ; set sys_write syscall
mov ecx, byte [hello + ebx] ; ...
mov edx, 1 ; move one byte at a time
int 0x80 ;
inc ebx ; i++
mov ecx, ebx ; move ebx back to ecx
jmp loop ;
exit:
mov eax, 0x01 ; 0x01 = syscall for exit
int 0x80 ;
NEBEN
Meinem Makefile:
sandbox: sandbox.o
ld -o sandbox sandbox.o
sandbox.o: sandbox.asm
nasm -f elf -g -F stabs sandbox.asm -l sandbox.lst
Modifizierte Code:
section .bss
section .data
hello: db "Hello World",0xa ;10 is EOL
section .text
global _start
_start:
mov ecx, 0; ; int i = 0;
while:
mov dl, byte [hello + ecx] ; while(data[i] != EOF) {
cmp dl, 0xa ;
je exit ;
mov ebx, ecx ; store conetents of i (ecx)
; Print single character
mov eax, 4 ; set sys_write syscall
mov cl, byte [hello + ebx] ; ...
mov edx, 1 ; move one byte at a time
int 0x80 ;
inc ebx ; i++
mov ecx, ebx ; move ebx back to ecx
jmp while ;
exit:
mov eax, 0x01 ; 0x01 = syscall for exit
int 0x80 ;
- Lesen Sie meinen Kommentar über das zusätzliche Zeichen, das Sie erwähnt in der "Bearbeiten".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Einer der Gründe, warum es nicht gedruckt ist, weil
ebx
ist soll Sie den Wert 1 angebenstdin
, und ein anderer ist, weilsys_write
nimmt einen Zeiger (die Adresse des Strings) als ein argument, nicht eine tatsächliche Charakter Wert.Wie auch immer, lassen Sie mich Ihnen zeigen, eine einfachere Möglichkeit der Strukturierung Ihres Programms:
Kann es einfacher sein, zu NULL zu beenden Sie Ihren string so wie ich, oder Sie können auch
$-hello
zu erhalten es ist die Länge, die zur compile-Zeit. Ich habe auch die Register fürsys_write
bei jeder iteration in der Schleife (wie Sie tun), dasys_write
nicht erhalten Sie alle Register.0xA
ab Endehello
, aber nicht verwenden Sie den Wert0xA
als string Kündigung Wert.Ich weiß nicht, wie Sie Ihren code zu montieren, aber es hat nicht montieren, hier ein paar sehr gute Gründe.
Können Sie nicht verwenden
loop
als label-Namen, weil dieser name ist reserviert für dieloop
Unterricht.Ihre Linie 20 die Anweisung
mov ecx, byte [hello + ebx]
nicht montieren, weil entweder die Quell-und Ziel-Operanden-Größen nicht übereinstimmen (byte vs dword). Mögliche änderungen:mov cl, byte [Hallo + ebx]
mov ecx, dword [Hallo + ebx]
movzx ecx, byte [Hallo + ebx]
War das oben nicht der eigentliche code, den Sie hatte?