Assembly nasm x86-64程序集-两个变量作为一个变量读取

Assembly nasm x86-64程序集-两个变量作为一个变量读取,assembly,nasm,Assembly,Nasm,我正在制作一个简单的程序,用十六进制ASCII字符打印“你好,世界!”。 这是我的密码: SECTION .DATA msg db 'Printing Hello world in ASCII values: ', 0 msglen EQU $-msg char1 db 064h ; 'd' character char2 db 06Ch ; 'l' character char3 db 072h ; 'r' char4 db 06Fh ; 'o' char5 db 077h ; '

我正在制作一个简单的程序,用十六进制ASCII字符打印“你好,世界!”。 这是我的密码:

SECTION .DATA
msg db 'Printing Hello world in ASCII values: ', 0
msglen EQU $-msg
char1 db 064h  ; 'd' character
char2 db 06Ch  ; 'l' character
char3 db 072h  ; 'r' 
char4 db 06Fh  ; 'o'
char5 db 077h  ; 'w'
char6 db 020h  ; (space)
char7 db 06Fh  ; 'o'
char8 db 06Ch  ; 'l'      
char9 db 06Ch  ; 'l'
char10 db 065h ; 'e'
char11 db 048h ; 'H'

SECTION .bss

SECTION .text

GLOBAL _start:
_start:
nop
mov esi, 0

mov eax, 4
mov ebx, 1
mov ecx, msg
mov edx, msglen
int 80h
; printing 'H'
mov eax, 4
mov ebx, 1  
mov ecx, char11 
mov edx, 1
int 80h

; printing 'e'
mov eax, 4
mov ebx, 1  
mov ecx, char10
mov edx, 1
int 80h

; printing 'l'
mov eax, 4
mov ebx, 1  
mov ecx, char9
mov edx, 1
int 80h     

; printing 'l'
mov eax, 4
mov ebx, 1  
mov ecx, char8 
mov edx, 1
int 80h 

; printing 'o'
mov eax, 4
mov ebx, 1  
mov ecx, char7 
mov edx, 1
int 80h 

; printing space
mov eax, 4
mov ebx, 1  
mov ecx, char6 
mov edx, 1
int 80h 

; printing 'w'
mov eax, 4
mov ebx, 1  
mov ecx, char5 
mov edx, 1
int 80h

; printing 'o'
mov eax, 4
mov ebx, 1  
mov ecx, char4 
mov edx, 1
int 80h

; printing 'r'
mov eax, 4
mov ebx, 1  
mov ecx, char3 
mov edx, 1
int 80h

; printing 'l'
mov eax, 4
mov ebx, 1  
mov ecx, char2 
mov edx, 1
int 80h

; printing 'd'
mov eax, 4
mov ebx, 1  
mov ecx, char1 
mov edx, 1
int 80h

    ; end
mov eax, 1
mov ebx, 0
int 80h
我的问题:

我怎样才能做这样的事情:

loop:
    mov eax, 4
    mov ebx, 1
    mov ecx, char[incremented variable]
    mov edx, 1
    int 80h
    inc (incremented variable)
    jmp loop
我的意思是,如何将变量和递增计数器作为一个变量来读取


提前感谢。

您需要为字符串创建一个数组,声明方式与
msg
相同,加载指向该字符串的指针,取消引用以获取该字符,检查其是否为0,如果为0,则中断,否则打印并递增指针

例如:(对不起,MASM语法)


刚刚注意到您的标题是x86-64,但是您的代码(和我的代码)是纯x86,如果您实际上想要x64代码,那么系统调用的ABI会有一点变化,但其余的几乎相同

将角色放入ecx是行不通的!(SEGFULT)ecx希望成为地址(偏移量)

mov ecx, mystring ; address! (Masm uses "offset")
looptop:
cmp byte [ecx], 0 ; "[contents]"
jz done
mov edx, 1 ; length
mov ebx, 1 ; stdout
mov eax, 4 ; __NR_write
int 80h
inc ecx ; next address
jmp  looptop
done:
...


。。。像这样的事。。。如果你真的想要64位代码,系统调用号码是不同的-1为写和。。。3Ch(?)用于出口。使用
syscall
而不是“int80h”(当然还有64位regs)。如果您想用64位ld编写32位代码,请告诉ld“-m elf_i386”。

等一下。是否要打印字符的十六进制值(文本)而不是字符?像这样的?(高度未优化)


@AussieGamer:刚刚添加了一个,不幸的是,我没有使用nasm,所以我不得不使用masm语法,但是它们大致相同。是的,我在64位Linux机器上,希望这样可以。我以前做MASM汇编,但我改成了Linux。我也从来没有使用过数组,所以这篇文章就是这样。如果你想在Linux上使用类似Masm的语法,请查找Jwasm(“japheth.de”我想)或(G)as with“.intel syntax noprefix”非常接近。
mov ecx, mystring ; address! (Masm uses "offset")
looptop:
cmp byte [ecx], 0 ; "[contents]"
jz done
mov edx, 1 ; length
mov ebx, 1 ; stdout
mov eax, 4 ; __NR_write
int 80h
inc ecx ; next address
jmp  looptop
done:
...
global _start

section .data
    msg db "Hello World", 0
    hexbuf db "0xXX, "
    hexbuflen equ $ - hexbuf

section .text
_start:
mov esi, msg
looptop:
    mov al, [esi]
    test al, al
    jz done
    inc esi
    mov ah, al
    and al, 0Fh
    cmp al, 9
    jna skip
    add al, 7
skip:
    add al, '0'
    mov [hexbuf + 3], al
    mov al, ah
    shr al, 4
    and al, 0Fh
    cmp al, 9
    jna skip2
    add al, 7
skip2:
    add al, '0'
    mov [hexbuf + 2], al
    mov edx, hexbuflen
    mov ecx, hexbuf
    mov ebx, 1
    mov eax, 4
    int 80h
    jmp looptop
done:
    push 10
    mov ecx, esp
    mov edx, 1
    mov ebx, 1
    mov eax, 4
    int 80h
    add esp, 4

    mov eax, 1
    xor ebx, ebx
    int 80h
;-----------------