Assembly 程序集:来自用户的输入值(多个输入)

Assembly 程序集:来自用户的输入值(多个输入),assembly,input,bios,emu8086,Assembly,Input,Bios,Emu8086,这是汇编中的一个函数,用于以两个字符串“size”和“per”从用户处获取输入, 但它只需要1个输入,然后就开始崩溃 我需要帮助。先谢谢你 input: mov si,0 lb : mov ah,0 int 16h cmp al,0x0d je 2nd mov [size + si],al inc si loop lb 2nd: mov si,0 lb1: mov ah,0 int 16h mov [per + si],al cmp al,0x0d je 3rd inc si loop lb1

这是汇编中的一个函数,用于以两个字符串“size”和“per”从用户处获取输入,
但它只需要1个输入,然后就开始崩溃

我需要帮助。先谢谢你

input:
mov si,0
lb :
mov ah,0
int 16h
cmp al,0x0d
je 2nd
mov [size + si],al
inc si
loop lb
2nd:
mov si,0
lb1:
mov ah,0
int 16h
mov [per + si],al
cmp al,0x0d
je 3rd
inc si
loop lb1
3rd:
ret

要创建循环,不必使用
loop
指令

在第一个循环中,在按大小存储字符并在
SI
中增加指针后,您需要始终跳回循环的顶部。正确的指令是
jmp lb
,无条件跳转到标签lb

在第二个循环中,在增加
SI
中的指针后,您需要始终跳回该循环的顶部。正确的指令是
jmp lb1
,无条件跳转到标签lb1

您应该注意的一件事是在哪里检查ENTER键(ASCII 13):

  • 第一个循环在存储到内存之前检查它,因此字符串大小没有回车符
  • 第二个循环在存储在内存中之后检查它,因此回车符被附加到字符串per

这种差异可能不是您所期望的。

这不会在16b实模式下自行崩溃。此外,它也没有显示在第一次迭代之前如何设置
cx
。如果您在第一次输入时使用完整长度使用
cx
,则第二次输入将使用
cx=0
作为起点,使65536个字符的输入成为可能,这肯定会覆盖x86-16中的一些内存。另外,你有代码重复性,两个部分都是相同的,只需将它们放在一个例程中,调试那个例程,然后用参数调用它,比如
mov-si,OFFSET-size
mov-si,OFFSET-per
。。。无论如何,或者我会投票赞成结束这个,因为您没有显示足够的相关代码。而且emu8086具有内置调试器,您可能希望使用它来验证您对寄存器/内存/等中的值的所有假设,这也将允许您更好地描述结果与预期不同的指令。“崩溃”的描述毫无意义。
input:
    mov si, 0
lb :
    mov ah, 0
    int 16h
    cmp al, 0x0d
    je  2nd
    mov [size + si], al
    inc si
    jmp lb              ; The unconditional jump
2nd:
    mov si, 0
lb1:
    mov ah, 0
    int 16h
    mov [per + si], al
    cmp al, 0x0d
    je  3rd
    inc si
    jmp lb1             ; The unconditional jump
3rd:
    ret