英文:
How can I display total sum in assembly language?
问题
以下是您的代码的翻译部分:
org 100h
section .data
roll_num db '210405702' ; 学号
roll_len equ $ - roll_num ; 学号字符串的长度
sum_msg db '总和为: $'
output_buffer db 16 ; 用于存储总和的转换字符串的缓冲区
result_msg db '接收到的数字为: $'
section .text
global _start
_start:
mov si, 0
mov cx, 0
sum_loop:
mov al, byte [roll_num + si] ; 改变 'a1' 为 'al'(8位寄存器)
sub al, 48 ; 减去 48 以将ASCII转换为十进制
add cx, ax ; 将 'ax' 改为 'cx' 进行加法
inc si ; 将si增加1
cmp si, roll_len ; 将si与roll_len比较
jl sum_loop ; 如果si < roll_len,则跳回sum_loop
mov ax, cx
test al, 1 ; 改变 'a1' 为 'al'(8位寄存器)
jz even
mov di, 1
jmp print_result
even:
mov di, 0
print_result:
mov ah, 09h
cmp di, 0
je even_num
mov dx, odd_msg ; 显示奇数消息
int 21h
jmp end_program
even_num:
mov dx, even_msg ; 显示偶数消息
int 21h
; 调用print_sum以显示总和
call print_sum
end_program:
mov ah, 4Ch
xor al, al
int 21h
print_sum:
mov ah, 09h
mov dx, sum_msg ; 显示总和消息
int 21h
mov bx, 10 ; 除以10以将总和转换为十进制字符串
xor cx, cx ; 清除cx寄存器
mov si, output_buffer + 15 ; 从缓冲区的末尾开始
convert_loop:
xor dx, dx ; 清除dx寄存器
div bx ; 用10除ax
add dl, 48 ; 将余数转换为ASCII
dec si ; 减少si
mov [si], dl ; 将转换后的数字存储在缓冲区中
inc cx ; 增加数字计数
test ax, ax
jnz convert_loop ; 如果ax != 0,则跳回convert_loop
mov dx, si ; 显示转换后的总和字符串
add dx, 1 ; 增加dx以跳过字符串末尾的'$'
mov ah, 09h
int 21h
section .data
odd_msg db '接收到的数字为奇数', 0Dh, 0Ah, '$'
even_msg db '接收到的数字为偶数', 0Dh, 0Ah, '$'
请注意,这个翻译是您提供的汇编代码的翻译部分,不包括问题或其他信息。如果您有关于代码的任何问题,请随时提出。
英文:
I'm working on program to calculate the sum in roll number and display output as the sum is even or odd. I have done everything and I'm getting the right output. The only issue is that my programing is not displaying the total sum on screen. It is just display the even or odd after calculation. I also want to display the sum output on screen.
here is my code:
org 100h
section .data
roll_num db '210405702' ; Roll Number
roll_len equ $ - roll_num ; Length of roll number string
sum_msg db 'The sum is: $'
output_buffer db 16 ; Buffer to store the converted sum as a string
result_msg db 'The received number is: $'
section .text
global _start
_start:
mov si, 0
mov cx, 0
sum_loop:
mov al, byte [roll_num + si] ; Changed 'a1' to 'al' (8-bit register)
sub al, 48 ; Subtract 48 to convert from ASCII to decimal
add cx, ax ; Changed 'ax' to 'cx' for addition
inc si ; Increment si by 1
cmp si, roll_len ; Compare si with roll_len
jl sum_loop ; Jump back to sum_loop if si < roll_len
mov ax, cx
test al, 1 ; Changed 'a1' to 'al' (8-bit register)
jz even
mov di, 1
jmp print_result
even:
mov di, 0
print_result:
mov ah, 09h
cmp di, 0
je even_num
mov dx, odd_msg ; Display odd message
int 21h
jmp end_program
even_num:
mov dx, even_msg ; Display even message
int 21h
; Call print_sum to display the total sum
call print_sum
end_program:
mov ah, 4Ch
xor al, al
int 21h
print_sum:
mov ah, 09h
mov dx, sum_msg ; Display the sum message
int 21h
mov bx, 10 ; Divide by 10 to convert sum to decimal string
xor cx, cx ; Clear cx register
mov si, output_buffer + 15 ; Start at the end of the buffer
convert_loop:
xor dx, dx ; Clear dx register
div bx ; Divide ax by 10
add dl, 48 ; Convert remainder to ASCII
dec si ; Decrement si
mov [si], dl ; Store converted digit in buffer
inc cx ; Increment digit count
test ax, ax
jnz convert_loop ; Jump back to convert_loop if ax != 0
mov dx, si ; Display the converted sum string
add dx, 1 ; Increment dx to skip the '$' at the end of the string
mov ah, 09h
int 21h
section .data
odd_msg db 'The received number is odd', 0Dh, 0Ah, '$'
even_msg db 'The received number is even', 0Dh, 0Ah, '$'
I tried to write some code. The code is working fine but still it's not showing total sum in output.
答案1
得分: 1
output_buffer db 16
xor cx, cx mov si, output_buffer + 15
mov ax, cx xor cx, cx mov si, output_buffer + 15 mov byte [si], "$"
mov dx, si add dx, 1 mov ah, 09h int 21h
add cx, ax
mov dx, odd_msg int 21h jmp end_program
mov ah, 09h int 21h
section .data
英文:
> output_buffer db 16
You don't have a buffer. The above just provides a single byte whereas your program expects a 16-byte buffer. Use output_buffer db 16 dup (0)
, or output_buffer times 16 db 0
(depending on the assembler).
> xor cx, cx
> mov si, output_buffer + 15
By the time you reach print_sum, the AX register no longer contains the sum, but CX does. And the string needs $-termination. Therefore write it like:
mov ax, cx
xor cx, cx
mov si, output_buffer + 15
mov byte [si], "$"
> mov dx, si ; Display the converted sum string
> add dx, 1 ; Increment dx to skip the '$' at the end of the string
> mov ah, 09h
> int 21h
It is wrong to add 1 to DX because SI was already pointing at the first digit to display.
> add cx, ax ; Changed 'ax' to 'cx' for addition
Make sure AH is 0 before you do this word-sized addition.
> mov dx, odd_msg ; Display odd message
> int 21h
> jmp end_program
You exit the program before printing the sum in case the sum is odd. Maybe this is intentional? If it is, it is bad because the sum is indeed an odd number (21).
> mov ah, 09h
> int 21h
>
> section .data
Here you have forgotten to exit the program!
mov ah, 09h
int 21h
jmp end_program <<<< new
section .data
答案2
得分: 0
Here's the translated content:
首先将 output_buffer db 16
更改为 output_buffer db 16 dup(0)
在这个示例中,和为奇数,等于21。
然后,您使用 test al, 1
,所以ZF被清除,因为最低有效位是1。
0 0 0 1 0 1 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
ZF=0
接下来DI = 1,您跳转到print_result,打印odd_msg并跳转到end_program。完全省略了Print_sum。
您应该将 jmp end_program
更改为 jmp print_sum
。
并且 call print_sum
与 jmp print_sum
相同,因为当您使用call时,指令指针被放入堆栈,而代码中没有ret指令。
在sum_loop之后使用 push ax
以保持sum在convert_loop之前不变,然后在convert_loop之前使用 pop ax
。
和sum一起打印在屏幕上,并在其后添加“接收到的数字是:”,因为在字符串末尾有$时,打印字符串会停止。因此,在convert_loop之前,您应该打印result_msg,然后计算sum。也许在字符串中加入以$结尾的行。
移动si,output_buffer + 15 ;$在缓冲区的末尾
移动dl,'$'
移动[si],dl
移动si,output_buffer + 14 ;并且我们在$之前放置数字
在.section .data之前添加 jmp end_program
。
英文:
First change output_buffer db 16
to output_buffer db 16 dup(0)
In this example sum is odd and equal 21.
Then You use test al, 1
so ZF is cleared because least sigificant bit is 1.
0 0 0 1 0 1 0 1
0 0 0 0 0 0 0 1
0 0 0 0 0 0 0 1
ZF=0
Next DI = 1 and You jump to print_result, print odd_msg and jmp to end_program. Print_sum is totally omitted.
You should change jmp end_program
to jmp print_sum
.
And call print_sum
same to jmp print_sum
because when You use call, instruction pointer is put on the stack and You don't have ret instruction in the code.
And use push ax
to keep sum intact after sum_loop and pop ax
before convert_loop.
Sum is printed on the screen + "The received number is:" after it because printing string stops when $ is at the end of the string. So You should print result_msg before convert_loop and then calculate sum. And maybe add before convert_loop lines with $ as last character in string
mov si, output_buffer + 15 ;$ is last in the buffer
mov dl,'$'
mov [si],dl
mov si, output_buffer + 14 ; and we put digits before $
Add jmp end_program
before section .data
:)))
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论