我必须为x86处理器编写一个nasm(或其他)汇编程序,在标准输出上打印32位十六进制数,例如printf(“%x\n”,123456),并使用write系统调用来显示。我写了一些代码,但似乎不起作用。comeone能帮我吗?
section .data
message db '0x',0
number dq 123456
section .text
global _start
_start:
; Print "0x"
mov eax, 4
mov ebx, 1
mov ecx, message
mov edx, 2
int 0x80
; Print number in hex
mov eax, number
push eax
call print_hex
add esp, 4
; Exit
mov eax, 1
xor ebx, ebx
int 0x80
; Function to print number in hex
print_hex:
push ebx
push edx
mov ebx, 16
mov edx, 0
mov ecx, 0
print_hex_loop:
xor edx, edx
div ebx
add edx, '0'
cmp edx, '9'
jg print_hex_digit
push edx
inc ecx
test eax, eax
jne print_hex_loop
print_hex_done:
mov eax, 4
mov ebx, 1
mov edx, ecx
int 0x80
print_hex_pop_loop:
pop edx
mov [esp], edx
inc esp
dec ecx
jne print_hex_pop_loop
pop edx
pop ebx
ret
print_hex_digit:
add edx, 'A' - '9' - 1
jmp print_hex_done
我是汇编程序新手,所以我不知道如何让它正常工作
1条答案
按热度按时间5tmbdcev1#
我假设该函数接受一个如下所示的无符号32位数
这里的想法是保留32位整数的最大长度(16个字符加上末尾的空字符),然后开始向后填充十六进制数。
一旦数字变为零,我们就打印并返回。
呼叫者可以是
运行它会产生