我的工作程序来计算卷数和显示输出的总和是偶数或奇数。我已经做了所有的事情,我得到了正确的输出。唯一的问题是,我的编程是不显示屏幕上的总和。它只是显示计算后的偶数或奇数。我还想在屏幕上显示总和输出。
下面是我的代码:
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, '$'
我试着写了一些代码。代码工作正常,但仍然没有显示输出的总和。
2条答案
按热度按时间lskq00tm1#
你没有缓冲器。上面的代码只提供了一个字节,而你的程序需要一个16字节的缓冲区。使用
output_buffer db 16 dup (0)
或output_buffer times 16 db 0
(取决于汇编程序)。当您到达 print_sum 时,AX寄存器不再包含总和,但CX包含。字符串需要$-终止。因此,将其写成:
将1加到DX是错误的,因为SI已经指向要显示的第一个数字。
在进行此单词大小的加法之前,请确保AH为0。
如果总和是奇数,则在打印总和之前退出程序。也许这是故意的。如果是,它是坏的,因为和确实是一个 * 奇数 *(21)。
您忘记退出程序了!
zpgglvta2#
首先将
output_buffer db 16
更改为output_buffer db 16 dup(0)
在该示例中,sum是奇数并且等于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和jmp到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之前使用pop ax
。屏幕上打印的是sum+“The received number is:”,因为当$位于字符串末尾时,打印字符串停止。所以你应该在convert_loop之前打印result_msg,然后计算sum。也可以在convert_loop行之前加上$作为字符串的最后一个字符
在section .data之前添加
jmp end_program
:)))