6
votes

NASM Linux Assembly Impression d'entiers

J'essaie d'imprimer un entier unique entier dans NASM Assembly sous Linux. Ce que j'ai actuellement compilé, mais rien n'est écrit à l'écran. Quelqu'un peut-il m'expliquer ce que je fais mal ici? XXX


2 commentaires

Vous attribuez à EAX à ECX, puis 4. C'est probablement là.


Dupliqué possible de Comment imprimer un numéro dans l'assemblage NasM? Associé: Stackoverflow.com/Questtions/4117422/...


3 Réponses :


7
votes

Ceci est ajouté, ne pas stocker:

eax = 4
ebx = file descriptor (1 = screen)
ecx = address of string
edx = length of string


3 commentaires

J'ai essayé cela, et cela compile également bien, mais rien n'est écrit à l'écran.


Je ne peux toujours pas le faire travailler, mais je vais faire cette réponse acceptée.


@FroZenwaseland - Le problème restant est mentionné dans cette réponse, mais sans vous appeler votre attention spécifiquement à celle-ci: "ECX = adresse de chaîne edx = longueur de chaîne" Mais vous essayez de fournir l'octet de données lui-même incexe plutôt que l'adresse Là et une longueur dans EDX.



1
votes

de l'homme 2 écriture xxx

Outre les autres erreurs qui ont été signalées, écrire () prend un pointeur sur les données et une longueur, Pas un octet réel lui-même dans un registre comme vous essayez de fournir.

Vous devrez donc stocker vos données à partir d'un registre à la mémoire et utiliser cette adresse (ou si elle est constante, ne chargez pas les données dans un registre mais chargez-la à la place).


1 commentaires

Heureusement, ce n'était pas la partie clé de la réponse, mais incluse uniquement comme une commodité.



5
votes

Après avoir examiné les deux autres réponses, c'est ce que j'ai finalement proposé.

sys_exit        equ     1
sys_write       equ     4
stdout          equ     1

section .bss
    outputBuffer    resb    4       

section .text
    global _start

_start:
    mov  ecx, 1                 ; Number 1
    add  ecx, 0x30              ; Add 30 hex for ascii
    mov  [outputBuffer], ecx    ; Save number in buffer
    mov  ecx, outputBuffer      ; Store address of outputBuffer in ecx

    mov  eax, sys_write         ; sys_write
    mov  ebx, stdout            ; to STDOUT
    mov  edx, 1                 ; length = one byte
    int  0x80                   ; Call the kernel

    mov eax, sys_exit           ; system exit
    mov ebx, 0                  ; exit 0
    int 0x80                    ; call the kernel again


0 commentaires