汇编语言long int及数组使用异常:除法取模输出错误求助
问题:x86-64汇编格式化输出9位数字异常
我编写了一段x86-64汇编程序,用于对int数组执行除法、取模运算并格式化输出9位数字,但输出结果异常,与对应C程序的预期输出不符。怀疑问题出在数据段寄存器赋值、数组调用方式或寄存器使用上,尝试过修改数据类型、格式,调整[digits]和[r9 + r12*4]的取值,以及用qword转换整数、改为十六进制格式等操作,均未解决问题。
汇编代码
global _start section .text _start: mov r9, number ; rdi stores adress of number array mov r12, 0 ; get number of k for determine index of number array L3: ; function begin mov r15, 0 ; get number of i because using i of loop register mov r14, [digits] ; get number of digits mov r13, [r9 + r12*4] ; get array number for using array adress. We use 4*k because we take k. index of array syscall cmp r13, 0 ; determine number is negative or positive jl L2 ; if it is negative we goto else part for print minus ; print blank otherwise we print blank mov rax, 1 mov rdi, 1 mov rsi, blank mov rdx, 1 syscall jmp L1 ; after printing, jump L1 statement L2: ; if number is negative continiuos here so Else part ; print minus mov rax, 1 mov rdi, 1 mov rsi, minus mov rdx, 1 syscall neg r13 ; convert the negative number to positive number L1: ; into the loop ; division operation digit = (number/digits) mov rax, r13 ; dividend cqo mov rbx, r14 ; divisor idiv rbx ; after the div operation rbx store division mov r10, rax ; result is egual digit (r10) ; print digit add rsp , 8 add r10, 48 mov rax , 1 mov rdi, 1 push r10 mov rsi, rsp mov rdx, 1 syscall ; mod operation number = number % digits mov rax, r13 ; dividend cqo mov rbx, r14 ; divisor xor rdx, rdx ; rdx which store reminder be zero idiv rbx ; after the div operation rbx store division mov r13, rdx ; rdx store reminder and reminder egual number ; division operation digits = (digits/10) mov rdx, 1 mov rax, r14 ; dividend mov rbx, 10 ; divisor div rbx ; after the div operation rbx store division mov r14, rbx ; result is egual digit (r14) inc r15 ; increment the loop register cmp r15, 9 ; compare loop register with 9 so loop work 8 times jl L1 ; if loop register less than 9 return loop ; print new line mov rax, 1 mov rdi, 1 mov rsi, newline mov rdx, 1 syscall inc r12 ; increment k by 1 cmp r12, 8 ; compare k with numberCount jl L3 ; if k less than numberCount, goto L3 that is begining write9digits function Exit: ; if array index(k) greater than numberCount work Exit mov rax, 60 ; system call for exit xor rdi, rdi ; exit code 0 syscall ; invoke operating system to exit section .data newline db 10 ; note the newline at the end blank db ' ' minus db '-' i dd 0 k dd 0 digits dd 100000000 number dd 321762410, 9, 2943018, 0, 19372039, 18, -76241, -208424
当前错误输出
00000000 0�0000000 0�0000000 0�0000000 000000000 -0�0000000 -0�0000000 0_0000000
预期输出(对应C程序结果)
321762410 000000009 002943018 000000000 019371039 000000018 -000076241 -000208424
内容的提问来源于stack exchange,提问作者Mustafa Yilmaz
相关产品推荐
相关产品推荐

