我写了一个程序,它应该像一个 while 循环一样运行,打印出一定次数的文本字符串。
以下是代码:
我遇到的问题是程序进入了一个无限循环。我在gdb中运行它并发现原因是:
调用int 0x80来打印消息,这一步是正确的,但在中断结束后,r8寄存器的内容被设置为零,而不是应有的值。r8是计数器所在的位置,用于计算(递减)字符串被打印的次数。
int 0x80是否会修改寄存器的值?我注意到rax、rbx、rcx和rdx没有受到同样的影响。
测试结果
答案:是的!它确实修改了r8。
我在程序中做了两件事情。首先,我现在使用
在
以下是代码:
global _start
section .data
msg db "Hello World!",10 ; define the message
msgl equ $ - msg ; define message length
; use minimal size of storage space
imax dd 0x00001000 ; defines imax to be big!
section .text
_start:
mov r8, 0x10 ; <s> put imax in r8d, this will be our 'i' </s>
; just attempt 10 iterations
_loop_entry: ; loop entry point
mov eax, 4 ; setup the message to print
mov ebx, 1 ; write, stdout, message, length
mov ecx, msg
mov edx, msgl
int 0x80 ; print message
; this is valid because registers do not change
dec r8 ; decrease i and jump on not zero
cmp r8,1 ; compare values to jump
jnz _loop_entry
mov rax, 1 ; exit with zero
mov rbx, 0
int 0x80
我遇到的问题是程序进入了一个无限循环。我在gdb中运行它并发现原因是:
调用int 0x80来打印消息,这一步是正确的,但在中断结束后,r8寄存器的内容被设置为零,而不是应有的值。r8是计数器所在的位置,用于计算(递减)字符串被打印的次数。
int 0x80是否会修改寄存器的值?我注意到rax、rbx、rcx和rdx没有受到同样的影响。
测试结果
答案:是的!它确实修改了r8。
我在程序中做了两件事情。首先,我现在使用
cmp r8, 0
来得到正确次数的Hello World!,其次,我添加了:mov [i], r8 ; put away i
在
_loop_entry:
之后,我还加入了。mov r8, [i] ; get i back
在第一个int 0x80
之后。
这是我的现在工作的程序。更多关于与C ++性能的信息即将到来。
;
; main.asm
;
;
; To be used with main.asm, as a test to see if optimized c++
; code can be beaten by me, writing a for / while loop myself.
;
;
; Absolute minimum code to be competative with asm.
global _start
section .data
msg db "Hello World!",10 ; define the message
msgl equ $ - msg ; define message length
; use minimal size of storage space
imax dd 0x00001000 ; defines imax to be big!
i dd 0x0 ; defines i
section .text
_start:
mov r8, 0x10 ; put imax in r8d, this will be our 'i'
_loop_entry: ; loop entry point
mov [i], r8 ; put away i
mov eax, 4 ; setup the message to print
mov ebx, 1 ; write, stdout, message, length
mov ecx, msg
mov edx, msgl
int 0x80 ; print message
; this is valid because registers do not change
mov r8, [i] ; get i back
dec r8 ; decrease i and jump on not zero
cmp r8,0 ; compare values to jump
jnz _loop_entry
mov rax, 1 ; exit with zero
mov rbx, 0
int 0x80
int 0x80
ABI会将r8-r11
寄存器清零并保留其他所有内容。 - Peter Cordes