利用汇编子程序定义和调用,完成下面要求的汇编程序编制。 编程:商品数组product中按照商品ID(0-9之间)保存的每样商品对应的价格(假设价格为整数),从键盘输入需要购买的一组商品的ID(假设一次性购买商品不超过10件),计算需要购买商品的总价,并显示出来。 要求如下: (1)接收从键盘输入的商品ID,并依次存放于cart数组中。(此功能由input子程序实现,以“回车”符结束。) (2)根据cart中的商品ID,查找product数组中每件商品的单价,并计算总价。(此功能由checkout子程序实现) (3)将总价转换为10进制数从屏幕上显示出来。(此功能由output子程序实现)
时间: 2024-03-13 22:44:27 浏览: 70
好的,以下是实现你要求的汇编程序代码(使用x86汇编语言,适用于Windows操作系统):
```assembly
.model small
.stack 100h
.data
product db 10, 20, 30, 40, 50, 60, 70, 80, 90, 100 ; 商品单价数组
cart db 10 dup(0) ; 存放购买商品ID的数组
total_price dw 0 ; 存放总价的变量
msg1 db '请输入需要购买的商品ID(0-9之间),以回车键结束:$'
msg2 db '您需要支付的总价为:$'
.code
mov ax, @data
mov ds, ax
; input子程序:接收从键盘输入的商品ID,并依次存放于cart数组中
input:
mov cx, 10 ; 最多输入10件商品
lea di, cart
mov ah, 0ah
input_loop:
mov dx, offset msg1
int 21h ; DOS中断21h,显示提示信息
mov ah, 0
int 16h ; BIOS中断16h,读取键盘输入
cmp al, 13 ; 检查是否输入回车键
je input_done
cmp al, '0'
jb input_loop ; 输入无效,重新输入
cmp al, '9'
ja input_loop ; 输入无效,重新输入
mov [di], al ; 将输入的商品ID存入cart数组
inc di
loop input_loop
input_done:
ret
; checkout子程序:根据cart中的商品ID,查找product数组中每件商品的单价,并计算总价
checkout:
mov cx, 10 ; 最多购买10件商品
lea si, cart
mov bx, offset product
mov ax, 0
checkout_loop:
mov dl, [si]
sub dl, '0'
cmp dl, 0
jb checkout_next ; 输入无效或超过10件商品,跳过计算
cmp dl, 9
ja checkout_next ; 输入无效或超过10件商品,跳过计算
mov al, [bx+dl] ; 查找商品单价
add ax, [total_price] ; 累加到总价中
mov [total_price], ax
checkout_next:
inc si
loop checkout_loop
ret
; output子程序:将总价转换为10进制数从屏幕上显示出来
output:
mov bx, 10
mov cx, 0
output_loop:
mov dx, 0
div bx
push dx
inc cx
test ax, ax
jnz output_loop
mov bx, offset msg2
mov ah, 9
int 21h ; DOS中断21h,显示提示信息
mov ah, 2
output_print:
pop dx
add dl, '0'
int 21h ; DOS中断21h,显示数字
loop output_print
ret
start:
call input
call checkout
call output
mov ah, 4ch
int 21h ; DOS中断21h,程序结束
end start
```
程序中定义了三个子程序:input、checkout和output,分别实现了输入购买商品ID、计算总价和输出总价的功能。主程序中先调用input子程序获取输入的购买商品ID,然后将它们传递给checkout子程序计算总价,最后将总价传递给output子程序输出到屏幕上。
注意,在汇编语言中没有现成的哈希表数据结构,因此我们使用了一个product数组来保存商品单价。在checkout子程序中,我们使用了一个循环来遍历cart数组中的每个商品ID,并通过查找product数组来获取商品单价,然后累加到总价中。
在output子程序中,我们使用了除法操作和栈来将总价转换为10进制数,并使用DOS中断21h来显示提示信息和数字。
另外,由于汇编语言中没有自动内存管理功能,我们需要手动设置数据段(ds)和堆栈段(ss)寄存器,以及使用lea指令来计算数组地址。
阅读全文