Điều này cần được thực hiện trong quá trình lắp ráp thuần túy (ví dụ: không có thư viện hoặc cuộc gọi đến C).Xuất các số nguyên trong hội đồng trên Linux
Tôi hiểu bản chất của vấn đề: người ta cần chia số nguyên cho 10, chuyển đổi phần còn lại một chữ số thành ASCII, đầu ra và sau đó lặp lại quá trình với thương.
Nhưng vì lý do nào đó, nó không hoạt động. Tôi đang sử dụng NASM trên x86.
Dưới đây là những gì tôi có cho đến nay (bất cứ điều gì không đầu ra, nhưng không ném bất kỳ lỗi lắp ráp một trong hai):
; integer to output is stored in eax
mov ecx, 10 ; for base 10
loop:
div ecx ;EAX contains the quotient, EDX the remainder
; Do something to EDX to convert it to ASCII, not sure if this is correct
add edx, '0'
push eax ;We'll be playing with EAX to output EDX, save EAX to the stack
mov eax, 4 ; sys_write
mov ebx, 1 ; to STDOUT
mov ecx, edx
mov edx, 1
int 0x80
pop eax ;restore EAX
cmp eax, 0 ;If EAX is 0, our job is done
jnz loop
Có một số câu hỏi tương tự với trang này (cụ thể là, this và this), nhưng tôi bị mất trong quá trình triển khai. This question (cho DOS) cũng hữu ích, nhưng tôi vẫn còn bối rối.
Tôi phải thiếu điều gì đó ở đây. Suy nghĩ?
Tôi không thấy hằng số '10' ở bất kỳ đâu trong mã này, điều này cần thiết để in ra các chữ số thập phân. (Bạn cần phải lặp lại 'div' và' mod' bằng '10', lưu trữ các chữ số, đảo ngược chúng, và xuất chúng. Hoặc đi từ 'đầu lớn' trước, và chia cho' 100,000,000', sau đó là '10.000.000' , v.v. - nhưng điều đó có thể không kém phức tạp hơn so với phương pháp lưu trữ và đảo ngược.) – sarnold
@sarnold Quên để bao gồm một dòng ở trên cùng. Đã chỉnh sửa câu hỏi của tôi để thêm nó. –
Tuyệt vời! Cảm ơn các cập nhật. – sarnold