这学期开了汇编课,其痛苦不言而喻,各种寄存器各种使用方法各种限制各种奇奇怪怪的规则(学得好的大神求不喷)。。。在啥都还没搞明白的时候实验就来了,明明很简单的程序整整折腾了我一个星期!感觉逻辑怎么看都很对各种问人问老师无果后上网去问网友,最终才得以解决(感谢解答了我的疑惑的热心的网友,/鼓掌),整个一辛酸史。。特写此文章希望跟我做一样实验的同学有个参照
.486
DATAS SEGMENT USE16
NUM DB -2,9,5,-4,10,22,8,4,7
MIN DB ?
FUSHU DB 0
DATAS ENDS
CODES SEGMENT USE16
ASSUME CS:CODES,DS:DATAS
START:
MOV AX,DATAS
MOV DS,AX
MOV CX,8
MOV BX,OFFSET NUM
MOV AL,BYTE PTR [BX] ;AL装小数,BX装大数
INC BX ;bx指向下一个
JMP LAST
AGAIN:
MOV AL,BYTE PTR [BX] ;将小数付给al
JMP NEXT
LAST:
CMP [BX],AL ;比较bx和al
JL AGAIN ;若bx比al小则跳转
NEXT:
INC BX
LOOP LAST
FINAL:
MOV DH,AL
CMP DH,0
JG XIAN
MOV AH,2 ;如果最小数是负数先输出‘-’
MOV DL,'-'
INT 21H
NEG DH ;如果最小数是负数则将最小数取相反数
XIAN:
ADD DH,30H
MOV DL,DH ;输出al
INT 21H
MOV DL,32 ;输出空格,方便查看
INT 21H
MOV BX,OFFSET NUM ;查找负数的个数
MOV CX,9 ;循环9次
AA:
CMP BYTE PTR [BX],0
JL COUNT
JMP BB
COUNT:
INC FUSHU
BB:
INC BX
LOOP AA
ADD FUSHU,30H ;输出负数个数
MOV DL,FUSHU
INT 21H
MOV AH,4CH
INT 21H
CODES ENDS
END START
运行结果第一个数为最小数(目前只能显示(-10,10)的数,要显示范围以外的可以参照教程),第二个数为负数个数。
最后强调一件事情,也是导致我弄了那么久的罪魁祸首,重要的事情说三遍:DOS功能调用中的2号功能会影响AL寄存器的内容,DOS功能调用中的2号功能会影响AL寄存器的内容,DOS功能调用中的2号功能会影响AL寄存器的内容!!
第一次写汇编代码,很多不足望大大们多多包涵。