;从键盘上输入n个字符(n<128)并按顺序存放在存储单元中,键入“Enter”键结束输入;然后按顺序在显示器上输出(“Enter”键ASCII码为0DH)
data segment
msg db 13,10,"please input:$"
msg2 db 128 dup("$")
data ends
code segment
assume cs:code,ds:data
start:
mov ax,data
mov ds,ax
lea dx,msg
mov ah,09h
int 21h
lea di,msg2
input:
mov ah,01h
int 21h
cmp al,0dh
jz quit
mov [di],al
inc di
cmp di,offset msg2+128
jz quit
jmp input
quit:
lea dx,msg2
mov ah,09h
int 21h
mov ah,4ch
int 21h
code ends
end start
思路
先输出msg提示用户输入,然后设置一个循环就是input那一段
循环跳出条件是要么按了回车
#####要么128个字符满了
如果两个条件都不满足,那么就将输入的字符保存进数据段的msg2里面,别忘了每次都要将di+1
如果满足退出跳出,则输出msg2 然后退出
下面练习一下debug工具
我们先-t运行到第一个int 21h位置,然后直接-p 这样就可以直接输入不然他还要进入一个子程序(emmm 应该是这样吧)
我这里输入了1和2 接下来我们看看数据段里面的数据
先-r (也可以不-r -t之后直接就有)等到inc di命令执行之后再查看 不然此时2应该还没保存进去
现在可以看到 di为14 so 输入 -d ds:0000
看到没1,2在0013和0014的位置
下面列一下常用的跳转指令
指令 | 解释 | 标志位 |
---|---|---|
JZ(JE) | 结果为0(或相等)则转移 | ZF=1 |
JNZ(JNE) | 结果不为0(或不相等) | ZF=0 |
JC | 结果有进位则转移 | CF=1 |
JNC | 结果无进位则转移 | CF=0 |
JS | 结果为负则转移 | SF=1 |
JNS | 结果为正则转移 | SF=0 |
JO | 结果溢出则转移 | OF=1 |
JNO | 结果不溢出则转移 | OF=0 |
JP | 结果为偶数个1则转移 | PF=1 |
JNP | 结果为奇数个则转移 | PF=0 |