假设数据段从BUF单元开始,存有20个字节的有符号数。请编写一个完整源程序实现: (1)将其中的非负数送数据段PLUS开始的若干单元。 (2)统计非负数的个数,并以十六进制的形式显示在屏幕上
时间: 2023-06-19 09:05:04 浏览: 228
以下是一个可能的实现,使用MASM汇编语言:
```
.model small
.stack 100h
.data
BUF db 0, -1, 2, -3, 4, -5, 6, -7, 8, -9, 10, -11, 12, -13, 14, -15, 16, -17, 18, -19
PLUS db 20 dup(0)
COUNT dw 0
.code
mov ax, @data
mov ds, ax
mov si, offset BUF
mov di, offset PLUS
mov cx, 20
mov bx, 0
loop1:
cmp [si], 0
jl negative
mov [di], [si]
inc di
inc bx
jmp next
negative:
; do nothing
next:
inc si
dec cx
jnz loop1
mov COUNT, bx
mov ah, 9
lea dx, [msg1]
int 21h
mov ax, COUNT
call print_hex_word
mov ah, 4ch
int 21h
print_hex_word proc near
push ax
push bx
push cx
push dx
mov bx, 16
mov cx, 4
loop2:
rol ax, cl
mov dl, al
and dl, 0fh
cmp dl, 10
jl numeric
add dl, 'A' - 10
jmp next2
numeric:
add dl, '0'
next2:
mov ah, 2
int 21h
dec bx
jnz loop2
pop dx
pop cx
pop bx
pop ax
ret
print_hex_word endp
msg1 db "Number of non-negative integers: ", 0
end
```
代码的主要思路是使用两个指针 `si` 和 `di` 分别指向 `BUF` 和 `PLUS` 数组的开头,对 `BUF` 中的每个字节进行判断。如果该字节为非负数,则将其复制到 `PLUS` 中,并将指针 `di` 向后移动。如果该字节为负数,则跳过。最后,使用一个变量 `COUNT` 统计非负数的个数,并将其以十六进制形式显示在屏幕上。
注意,在这个程序中,使用了一个名为 `print_hex_word` 的过程,它可以将一个十六进制的字(word)打印到屏幕上。该过程的实现使用了一些位运算和字符输出的 DOS 中断。
阅读全文