在这一点上,我感到非常迷茫,这就是为什么我的代码看起来像这样
org 100h
start:
xor ax, ax
xor dx, dx
mov ah, 1
xor cx, cx
input:
int 21h
cmp al, '+'
jz sum
push ax
inc cx
jmp input
sum:
push bp
mov bp, sp
mov cx, [bp+4]
mov si, 6
xor ax, ax
sum_loop:
push bp
mov bp, sp
mov ax, [bp+6]
mov bx, [bp + 4]
add ax, bx
mov [result], ax
pop ax
loop sum_loop
pop bp;
ret
print:
mov al, [result]
mov bl, 10
div bl
mov [pt_one], ah
xor ah, ah
div bl
mov [pt_two], ah
xor ah, ah
add al, 48
mov dl, al
mov ah, 2
int 21h
mov al, [pt_two]
add al, 48
mov dl, al
mov ah, 2
int 21h
xor al, al
mov al, [pt_one]
add al, 48
mov dl, al
mov ah, 2
int 21h
mov ax, 4c00h
int 21h
section .data
pt_one db 1
pt_two db 1
result db 0
在这里,我确信输入部分可以正常工作,但我不知道是我的求和协议有问题还是我的打印方式有问题。求和时,我尝试添加 2 个下一个元素并将其添加到结果变量中,然后删除堆栈顶部。当我尝试此代码(通常我输入 123+)并输入 + 时,什么也没发生,老实说,我不知道如何修复它。
一个问题是由
ret
指令引起的。ret
从堆栈中弹出地址并将其加载到程序计数器中。但是您从未将此call
代码作为函数,因此堆栈不包含任何有效的返回地址。程序跳转到“随机”地址,特别是与 之前最后一个输入字符的 ASCII 码进行或运算的 0100h+
。如果您的输入是123+
,则伪造的地址是0133h
。偶然碰巧有mov bl, 10
指令,因此mov al, [result]
跳过 。然后div bl
尝试ax
除以10
,但ax
值取决于初始值( /bp
之后),而初始值通常是未定义的。push bp
pop ax
该代码还存在其他问题:
ax
。10
我想这不是您想要的。+
,loop
则进行65536次迭代。该程序可以简化:将临时值保存在寄存器中,而不是将它们存储到内存中。我假设目标是明确地迭代堆栈,而不是
pop
在每次输入迭代中直接添加值或添加值,而不将它们存储到内存中。在这种情况下,完整的程序可以是以下内容: