题目
商品数组products中按照商品ID(0-9之间)保存的每样商品对应的价格(假设价格为整数),从键盘输入需要购买的一组商品的ID(假设一次性购买商品不超过10件),计算需要购买商品的总价,并显示出来。假设商品的价格为55,10,25,13,90,5,15,24,68,20(id为0~9)
思路
- 在输入子程序的时候,如果输入的个数是10个,自动打印个换行出来;如果最后的输入是换行符,则无需再次打印换行
- 在进制转换的时候,可以在从网上查找相关资料,结合栈的技术完成16进制转化为10进制,并在屏幕显示
- 输入功能调用和输出功能调用
MOV DL,48 ; 十进制的48对应的ASCII值为0
MOV AH,0200H
int 21H ;会将字母0打印到屏幕上
MOV AH 0100H
int 21H ;系统产生中断,直至从键盘录入一个字符至AL寄存器中
效果图
在最后一个样例中,输入10个id后,程序自动打印换行;前面两个样例,是自己输入的换行作为输入ids结束的标志
十六进制转十进制
思路
十六进制的数除以10,余数入栈,
假设AX=59H BX=0(16进制数)——(10进制=89)
加个子程序
loop:
mov a,ax
sub a,1
mov ax,A
mov a,bx ;减C标志
Sbc a,0h
mov bx,A
snz c 判断BX带标志-0是否借位 借位就跳出循环 不借位就进行+1 daa模式
jmp END
mov a,1 ;减得断表示16进制的数还不=0 所以继续加1 如果需要3个寄存器放数据的
add a,al ;后面加写寄存器和BL的ADC模式一样
daa al 十进制转换;
mov a,0
adc a,bl ; 带C标志加
daa bl 十进制转换;
jmp loop
END :
ret
实现代码
.model small
.data
product db 55,10,25,13,90,5,15,24,68,20
array db 10 dup(10)
.stack
db 5 dup(?)
.code
start:
mov ax, @data
mov ds, ax
mov ax, @stack
mov ss, ax
mov sp, 55
call input
call calculate
call print
mov ax, 4c00h
int 21h
input:
mov si, 0 ; 下标
mov cx, 10
s1:
mov ah, 01h ; 输入
int 21h
cmp al, 13 ; 判断是否回车
je break1
sub al, 48 ; ASCII(0) = 48
mov array[si], al
inc si
loop s1
break1:
cmp cx, 0 ; 如果输入了 10 个数则换行
jne exit
mov dl, 10
mov ah, 02h
int 21h
exit:
ret
calculate:
mov ax, 0 ; 总金额
mov si, 0 ; 下标
mov cx, 10
s2:
cmp array[si], 10
je break2
mov bh, 0
mov bl, array[si] ; bx -> 商品 id
mov bl, product[bx] ; bx -> 商品价格
add ax, bx
inc si
loop s2
break2:
ret
print:
mov bx, 0 ; 栈的高度
mov cx, 3 ; 90 * 10 = 900,长度最大为 3
s3:
mov dl, 10
div dl
mov dh, 0
mov dl, ah
push dx
inc bx
mov ah, 0
cmp ax, 0
je break3
loop s3
break3:
mov cx, bx
s4:
pop dx
add dl, 48
mov ah, 02h
int 21h
loop s4
ret
end start