鱼C论坛

 找回密码
 立即注册
查看: 512|回复: 5

汇编语言练习题

[复制链接]
发表于 2024-11-29 14:18:59 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1、在BUF和BUF+1、BUF+2单元分别放有一个无符号字节型数,编程序将其中最大数存入MAX单元,并在屏幕上显示。
2、从键盘上接收两个一位十六进制数X和Y,然后再输入一个A-D之间的一个字符,按下列要求计算。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-11-29 14:19:12 | 显示全部楼层
关于您的两个问题,我为您提供了一些思路:

1、将BUF、BUF+1、BUF+2单元中的无符号字节型数存入MAX单元并显示:
   - 您可以使用比较指令(如`CMP`)来找出三个字节中的最大值。
   - 然后将最大的那个值赋给MAX单元。
   - 使用输出命令(如BIOS中断)在屏幕上显示结果。

   示例代码大概框架:
  
  1. MOV AL, [BUF]      ; 将BUF单元的值放入AL寄存器
  2.    MOV BL, [BUF+1]    ; 将BUF+1单元的值放入BL寄存器
  3.    MOV CL, [BUF+2]    ; 将BUF+2单元的值放入CL寄存器
  4.    
  5.    CMP AL, BL
  6.    JAE NEXT_1         ; 如果AL >= BL,跳到NEXT_1
  7.    MOV AL, BL         ; 否则,BL是当前最大值

  8. NEXT_1:
  9.    CMP AL, CL
  10.    JAE DONE           ; 如果AL >= CL,跳到DONE
  11.    MOV AL, CL         ; 否则,CL是最大值

  12. DONE:
  13.    MOV [MAX], AL      ; 最大值存入MAX单元
  14.    ; 在此处添加显示代码
复制代码


2、从键盘接收两个一位十六进制数X和Y,以及一个A-D的字符并进行计算:
   - 您需要通过键盘中断(如`INT 21H`的功能号01H或08H)读取输入。
   - 根据输入的字符A-D,进行不同的运算,可能需要设计条件判断来处理不同的字符。

   具体操作可以如下实现:
  
  1. ; 键盘输入X、Y
  2.    ; 输入A-D字符

  3.    CMP CHAR, 'A'
  4.    JE OPERATION_A

  5.    CMP CHAR, 'B'
  6.    JE OPERATION_B

  7.    CMP CHAR, 'C'
  8.    JE OPERATION_C

  9.    CMP CHAR, 'D'
  10.    JE OPERATION_D

  11.    OPERATION_A:
  12.    ; 进行操作A
  13.    JMP END

  14.    OPERATION_B:
  15.    ; 进行操作B
  16.    JMP END

  17.    OPERATION_C:
  18.    ; 进行操作C
  19.    JMP END

  20.    OPERATION_D:
  21.    ; 进行操作D
  22.    JMP END

  23.    END:
  24.    ; 显示结果
复制代码


具体详细实现细节需要根据硬件平台和具体要求进一步细化。这只是一个基本框架,需要结合汇编的指令集及执行环境进一步完善。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-29 14:22:15 | 显示全部楼层
FishC 发表于 2024-11-29 14:19
关于您的两个问题,我为您提供了一些思路:

1、将BUF、BUF+1、BUF+2单元中的无符号字节型数存入MAX单元 ...

BUF中的值是多少呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-29 14:22:22 | 显示全部楼层
fish111 发表于 2024-11-29 14:22
BUF中的值是多少呢?


在汇编语言中,`BUF`、`BUF+1`、`BUF+2`等是内存单元地址,它们代表程序运行时数据存放的位置。您需要在程序中或程序运行前后,通过某种方式为这些内存位置赋值。汇编语言通常不在代码中直接指定这些值,因为它的目标是操作寄存器和内存,而不是管理具体数值。

如果您希望程序在操作时有特定的初始值,那么您需要在程序的适当位置对这些内存地址进行数据赋值。例如,您可以在程序启动时将某些值存入这些内存单元。

示例:假设您希望`BUF`、`BUF+1`、`BUF+2`分别存放10、20、30,那么您可以这样初始化:

  1. MOV BYTE PTR BUF, 10
  2. MOV BYTE PTR BUF+1, 20
  3. MOV BYTE PTR BUF+2, 30
复制代码


请根据您的具体需求来设置这些初始值。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2024-11-29 15:28:59 | 显示全部楼层
FishC 发表于 2024-11-29 14:22
在汇编语言中,`BUF`、`BUF+1`、`BUF+2`等是内存单元地址,它们代表程序运行时数据存放的位置。您需要 ...


从键盘上接收两个一位十六进制数X和Y,然后再输入一个A-D之间的一个字符,按下列要求计算。
a)当输入字符为A,则计算X+Y,并以十六进制形式显示出来
b)当输入字符为B,则计算|X-Y|,并以十六进制形式显示出来
c)当输入字符为C,则计算X*Y,并以十六进制形式显示出来
d)当输入字符为D,则计算X/Y,并以十六进制形式显示出来
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-29 15:29:24 | 显示全部楼层
fish111 发表于 2024-11-29 15:28
从键盘上接收两个一位十六进制数X和Y,然后再输入一个 ...


要实现这个功能,您需要使用汇编语言中的中断和基本的算术指令。以下是该逻辑的框架代码示例:

  1. .DATA
  2.     PROMPT1 DB 'Enter first hex digit (0-9, A-F): ', '$'
  3.     PROMPT2 DB 'Enter second hex digit (0-9, A-F): ', '$'
  4.     CHAR_PROMPT DB 'Enter operation character (A-D): ', '$'
  5.     RESULT_MSG DB 'Result: ', '$'
  6.     INVALID_INPUT DB 'Invalid input!', 0Dh, 0Ah, '$'

  7. .CODE
  8. START:
  9.     ; 显示提示并读取第一个数字X
  10.     MOV AH, 09H
  11.     LEA DX, PROMPT1
  12.     INT 21H
  13.     CALL READ_HEX
  14.    
  15.     ; 保存第一个数字
  16.     MOV BL, AL
  17.    
  18.     ; 显示提示并读取第二个数字Y
  19.     MOV AH, 09H
  20.     LEA DX, PROMPT2
  21.     INT 21H
  22.     CALL READ_HEX
  23.    
  24.     ; 保存第二个数字
  25.     MOV BH, AL
  26.    
  27.     ; 显示提示并读取操作字符
  28.     MOV AH, 09H
  29.     LEA DX, CHAR_PROMPT
  30.     INT 21H
  31.     CALL READ_CHAR
  32.    
  33.     ; 执行运算
  34.     CMP AL, 'A'
  35.     JE ADDITION
  36.    
  37.     CMP AL, 'B'
  38.     JE SUBTRACTION
  39.    
  40.     CMP AL, 'C'
  41.     JE MULTIPLICATION
  42.    
  43.     CMP AL, 'D'
  44.     JE DIVISION
  45.    
  46.     ; 如输入无效,显示错误信息
  47.     MOV AH, 09H
  48.     LEA DX, INVALID_INPUT
  49.     INT 21H
  50.     JMP END_PROGRAM

  51. ADDITION:
  52.     ; 计算 X + Y
  53.     MOV AL, BL
  54.     ADD AL, BH
  55.     JMP DISPLAY_RESULT
  56.    
  57. SUBTRACTION:
  58.     ; 计算 |X - Y|
  59.     MOV AL, BL
  60.     SUB AL, BH
  61.     JNB POSITIVE      ; 如果结果为正,跳到POSITIVE
  62.     NEG AL            ; 否则取负数
  63. POSITIVE:
  64.     JMP DISPLAY_RESULT

  65. MULTIPLICATION:
  66.     ; 计算 X * Y
  67.     MOV AL, BL
  68.     MUL BH
  69.     JMP DISPLAY_RESULT

  70. DIVISION:
  71.     ; 计算 X / Y
  72.     MOV AL, BL
  73.     XOR AH, AH        ; 清除AH,因为DIV使用AX
  74.     DIV BH
  75.     JMP DISPLAY_RESULT

  76. DISPLAY_RESULT:
  77.     ; 显示结果
  78.     MOV AH, 09H
  79.     LEA DX, RESULT_MSG
  80.     INT 21H
  81.    
  82.     ; 显示AL中的值
  83.     CALL DISPLAY_HEX
  84.     JMP END_PROGRAM

  85. READ_HEX PROC
  86.     ; 读取一个十六进制数字
  87.     MOV AH, 01H
  88.     INT 21H
  89.     SUB AL, 30H
  90.     CMP AL, 9
  91.     JBE HEX_OK
  92.     SUB AL, 7
  93. HEX_OK:
  94.     RET
  95. READ_HEX ENDP

  96. READ_CHAR PROC
  97.     ; 读取一个字符
  98.     MOV AH, 01H
  99.     INT 21H
  100.     RET
  101. READ_CHAR ENDP

  102. DISPLAY_HEX PROC
  103.     ; 将AL中的十六进制数字显示
  104.     ADD AL, 30H
  105.     CMP AL, 39H
  106.     JBE DISPLAY_OK
  107.     ADD AL, 7
  108. DISPLAY_OK:
  109.     MOV DL, AL
  110.     MOV AH, 02H
  111.     INT 21H
  112.     RET
  113. DISPLAY_HEX ENDP

  114. END_PROGRAM:
  115.     ; 程序结束
  116.     MOV AH, 4CH
  117.     INT 21H
复制代码


请注意:
- 这个示例假设您使用的是DOS环境,因为它使用了DOS中断服务。
- 在使用前,确保汇编汇编器和运行环境支持这些语法和中断。
- 错误处理较简单,如需完善需根据具体需求调整。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-5-9 15:29

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表