似乎je不起作用

时间:2017-10-26 01:38:16

标签: assembly dos x86-16 tasm

我试图创建一个简单的程序,让我选择是否要输入单词或数字。似乎je无法正常工作 我只是TASM的初学者,所以如果代码中出现多个错误,请记住纠正我。

.model small
.stack 64h
.data

msg1    db      "Input 1 for word, 2 for number", 13, 10, "$"
fw      db      "Input word", 13, 10, "$"
fn      db      "Input number", 13, 10, "$"
msg2    db      "HEY", 13, 10, "$"
input   db  10  dup ("$")
nl  db  13, 10, "$"

.code
mov ax, @data
mov ds, ax

mov ah, 09h
mov dx, offset msg1
int 21h

mov byte ptr input, 10
mov dx, offset input
mov ah, 0ah
int 21h

mov ah, 09h
mov dx, offset nl
int 21h 

lea si, input

check:
mov al, [si]
cmp al, 1
je w

n:  
mov ah, 09h
mov dx, offset fn
int 21h 
jmp exit

w:  
mov ah, 09h
mov dx, offset fw
int 21h
jmp exit


exit:   
mov ah, 4ch
int 21h

end

1 个答案:

答案 0 :(得分:1)

input   db  10  dup ("$")
nl  db  13, 10, "$"
...
mov byte ptr input, 10
mov dx, offset input
mov ah, 0ah
int 21h

您已经给DOS一个10字节的输入缓冲区(input db 10 dup ("$"))。如果你坚持将第一个字节设置为10(mov byte ptr input, 10),那么这个缓冲区不够长!如果键盘上的用户键入了第9个字符,DOS将覆盖标签 nl 处的字节,从而破坏您的程序。

对于BufferedInput函数0Ah,DOS期望一个指针(在DX中)指向缓冲区,该缓冲区在其第一个字节中具有从第3个字节开始的存储空间的长度。
在第二个字节中,您应该将其置于零,DOS将返回存储在存储空间中的字符数。
从DOS总是在存储空间中为这些字符附加回车的事实来看,如果你指定长度为 10 (在第1个字节中),用户最多可以输入 9 个字符。

您可以通过以下方式更正您的代码:

input   db  12  dup (0)
...
mov word ptr input, 10     ; First byte 10, second byte 0
mov dx, offset input
mov ah, 0Ah
int 21h

但是等等,因为你的输入实际上是在寻找一个字符,你可以写一下:

input   db  80  dup (0)
...
mov word ptr input, 2      ; First byte 2, second byte 0
mov dx, offset input
mov ah, 0Ah
int 21h

使用 2 ,您告诉DOS,存储空间可以容纳单个输入字符,然后是强制回车。您的代码并不需要更多!
另请参阅您可以定义一个大型输入结构(input db 80 dup (0)),但只使用它的一小部分(mov word ptr input, 2),具体取决于您的程序需要。

lea si, input
check:
mov al, [si]
cmp al, 1
je w

从上面的解释来看,要检查第一个/唯一的字符,你需要查看第3个字节:

    lea si, input
check:
    mov al, [si+2]

由于输入由字符组成,您必须与字符" 1" 进行比较,而不是数字1

    lea si, input
check:
    mov al, [si+2]
    cmp al, '1'
    je  w

相同但更小:

    cmp byte ptr [input + 2], '1'
    je  w

DOS TerminateWithExitcode函数4Ch,期望AL寄存器中的exitcode。请提供一个并写mov ax, 4C00h。 exitcode为0表示正常终止

exit:   
    mov ax, 4C00h
    int 21h