汇编代码将数组A
和B
合并,计算这些数组的元素和,并将结果存储在数组C
中。它还提供了一个过程printarray
,用于打印数组的全部内容,并使用此过程将数组A
、B
和C
的值打印到控制台。代码假定是一个类似DOS的环境,并且需要一个x86兼容的系统,该系统具有适当的汇编工具来执行。然而,它没有给给予我任何结果,当我试图调试它退出了程序
.model small
.stack 100h
.data
A dw 12, 5, 8, -1, 4
B dw -2, 9, 0, 18, 3
C dw 5 dup (?)
N dw 5
.code
mov ax,@data
mov ds,ax
push offset A
push offset B
push offset C
push N
call arraysum
push offset A
push N
call printarray
mov ah, 2
mov dl, 10
int 21h
push offset B
push N
call printarray
mov ah, 2
mov dl, 10
int 21h
push offset C
push N
call printarray
mov ah, 2
mov dl, 10
int 21h
.exit
sum proc near
push bp
mov bp,sp
mov ax,[bp+4]
add ax,[bp+6]
pop bp
ret 4
sum endp
arraysum proc near
push bp
mov bp, sp
mov cx,[bp+4]
mov di, [bp + 10]
mov si, [bp + 8]
mov bx,[bp+6]
next:
push word ptr [di]
push word ptr [si]
call sum
pop word ptr [di]
pop word ptr [si]
mov [bx], ax
add si, 2
add di, 2
add bx, 2
dec cx
jnz next
pop bp
ret 8
arraysum endp
printnum proc near
push bp
mov bp, sp
mov ax, [bp + 4]
mov bx, 10
mov cx, 0
cmp ax, 0
jge next
neg ax
next1:
mov dx, 0
div bx
add dx, 30h
push dx
inc cx
cmp ax, 0
jne next1
mov ax,[bp+4]
cmp ax, 0
jge sof
push '-'
inc cx
sof:
cmp cx, 0
jz ext
pop dx
mov ah, 2
int 21h
dec cx
jmp sof
ext:
pop bp
ret 2
printnum endp
printarray proc near
push bp
mov bp, sp
mov cx, [bp + 4]
mov si, [bp + 6]
print_loop:
push word ptr [si]
call printnum
add sp, 2
inc si
dec cx
jnz print_loop
pop bp
ret 4
printarray endp
end
2条答案
按热度按时间h22fl7wq1#
我改变/添加了一些东西。
OPTION NOKEYWORD:<C>
,编译器不再抱怨这是关键字。push offset A, B or C
行在.model
之前应用.186
、.286
、.286c
或.286p
指令时工作。在其他情况下,程序编译,但不打印结果在屏幕上或挂起。当.386
在.model
之后时也可以工作。(https://stackoverflow.com/a/62603303/20889367)1.在
sum proc
中,行ret 4
应该是ret
,因为在sum proc
程序弹出值之后,ret 4
将堆栈指针更改为错误的位置。1.调用
sum proc
后的指令顺序应该是pop word ptr [si], pop word ptr [di]
。printarray proc
,cx
中的值在printnum proc
中被破坏,所以我添加了push cx / pop cx
。1.在
printnum proc
中,由于上述cx
指令,我在mov ax, [bp + 6]
行的偏移量中添加了2个字节,并且程序以ret
而不是ret 2
结束。1.程序正确结束
ax = 4c00h, int 21h
。1.代码打印值之间的
' '
。测试结果:
代码:
pinkon5k2#
下面是代码中的所有问题:
1.退出码问题:在代码中,您使用DOS中断
int 21h
,AH设置为4Ch以退出程序。但是,在调用此中断之前,您还没有在AL中设置退出代码。在调用此中断之前,您应该将退出代码加载到AL中。例如,您可以在int 21h
之前添加mov al, 0
,以将退出代码设置为0。1.负数处理:这段代码似乎通过添加一个“-”字符来处理
printnum
过程中的负数。虽然这用于显示目的,但它不会修改实际数字。如果您打算在程序中使用负数,则需要考虑它们对计算的影响。1.无错误处理:代码没有错误处理机制。如果在执行过程中遇到错误(例如,被零除),程序可能会出现意外行为或崩溃。您应该包括错误检查和处理代码,以使程序更加健壮。
使程序集代码正确运行的代码。
代码:
最后一个问题,你为什么要使用汇编!?呵呵只是开玩笑