assembly 如何用汇编语言显示总和?

j8ag8udp  于 2023-05-23  发布在  其他
关注(0)|答案(2)|浏览(190)

我的工作程序来计算卷数和显示输出的总和是偶数或奇数。我已经做了所有的事情,我得到了正确的输出。唯一的问题是,我的编程是不显示屏幕上的总和。它只是显示计算后的偶数或奇数。我还想在屏幕上显示总和输出。
下面是我的代码:

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, '$'

我试着写了一些代码。代码工作正常,但仍然没有显示输出的总和。

lskq00tm

lskq00tm1#

output_buffer db 16

你没有缓冲器。上面的代码只提供了一个字节,而你的程序需要一个16字节的缓冲区。使用output_buffer db 16 dup (0)output_buffer times 16 db 0(取决于汇编程序)。

xor cx, cx
mov si, output_buffer + 15

当您到达 print_sum 时,AX寄存器不再包含总和,但CX包含。字符串需要$-终止。因此,将其写成:

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

将1加到DX是错误的,因为SI已经指向要显示的第一个数字。

add cx, ax         ; Changed 'ax' to 'cx' for addition

在进行此单词大小的加法之前,请确保AH为0。

mov dx, odd_msg             ; Display odd message
int 21h
jmp end_program

如果总和是奇数,则在打印总和之前退出程序。也许这是故意的。如果是,它是坏的,因为和确实是一个 * 奇数 *(21)

mov ah, 09h
    int 21h

section .data

您忘记退出程序了!

mov ah, 09h
    int 21h
    jmp end_program         <<<< new

section .data
zpgglvta

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_sumcall print_sumjmp 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行之前加上$作为字符串的最后一个字符

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 $

在section .data之前添加jmp end_program
:)))

相关问题