Assembly nasm x86-64程序集-两个变量作为一个变量读取
我正在制作一个简单的程序,用十六进制ASCII字符打印“你好,世界!”。 这是我的密码: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 ; '
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
;-----------------