鱼C论坛

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

[汇编作业] dosbox

[复制链接]
发表于 2024-11-12 19:58:55 | 显示全部楼层 |阅读模式

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

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

x
编程实现:

DATA SEGMENT

A DB 12H,34H,56H,78H

B DB 12H,34H,56H,78H

C DB 06H,07H,08H,09H

D DB ?,?,?,?

E DB 3

DATA ENDS

如果(E>0):求D=A+B+C(多字节运算)

否则:求D=A+B-C(多字节运算)(按高高低低的原则存储)
帮帮我,这个怎么写呀?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2024-11-12 19:59:06 | 显示全部楼层
这个问题是关于如何在汇编语言中实现多字节运算。下面是一个基于DOSBox(及其内的MASM/TASM)汇编语言的代码示例来实现你的需求:

  1. .MODEL SMALL
  2. .STACK 100H

  3. .DATA
  4. A DB 12H, 34H, 56H, 78H
  5. B DB 12H, 34H, 56H, 78H
  6. C DB 06H, 07H, 08H, 09H
  7. D DB 4 DUP(?)
  8. E DB 3

  9. .CODE
  10. START:
  11.     MOV AX, @DATA
  12.     MOV DS, AX
  13.     MOV ES, AX

  14.     MOV AL, E                     ; 读取 E 的值
  15.     CMP AL, 0
  16.     JG ADDITION                   ; 如果 E > 0,跳转到 ADDITION
  17.     JMP SUBTRACTION               ; 否则跳转到 SUBTRACTION

  18. ADDITION:
  19.     XOR SI, SI                    ; SI 清零,用于 index
  20.     XOR DI, DI                    ; DI 清零,用于 index
  21.     XOR AL, AL                    ; AL 清零,用于存储 CARRY
  22.     XOR AH, AH                    ; AH 清零,用于 CARRY

  23.     ADD_LOOP:
  24.         MOV BL, [A + SI]          ; 读取 A 的字节
  25.         ADD BL, [B + SI]          ; 加上 B 的字节,加上 CARRY(包含在 ADD 中,如果发生进位)
  26.         ADC BL, [C + SI]          ; 加上 C 的字节,加上 CARRY
  27.         MOV [D + DI], BL          ; 存入 D 的字节
  28.         INC SI                    ; SI 增1
  29.         INC DI                    ; DI 增1
  30.         CMP SI, 04H               ; 检查是否处理完所有字节
  31.         JNZ ADD_LOOP

  32.     JMP END_PROGRAM               ; 跳转到程序结束

  33. SUBTRACTION:
  34.     XOR SI, SI                    ; SI 清零,用于 index
  35.     XOR DI, DI                    ; DI 清零,用于 index
  36.     XOR AL, AL                    ; AL 清零,用于存储 BORROW
  37.     XOR AH, AH                    ; AH 清零,用于 BORROW (CARRY的相反)

  38.     SUB_LOOP:
  39.         MOV BL, [A + SI]          ; 读取 A 的字节
  40.         ADD BL, [B + SI]          ; 加上 B 的字节
  41.         SBB BL, [C + SI]          ; 减去 C 的字节,考虑 Borrow
  42.         MOV [D + DI], BL          ; 存入 D 的字节
  43.         INC SI                    ; SI 增1
  44.         INC DI                    ; DI 增1
  45.         CMP SI, 04H               ; 检查是否处理完所有字节
  46.         JNZ SUB_LOOP

  47.     JMP END_PROGRAM               ; 跳转到程序结束

  48. END_PROGRAM:
  49.     MOV AX, 4C00H                 ; 程序结束,返回到 DOS
  50.     INT 21H

  51. END START
复制代码


解释:
1. 初始化数据段。
2. 读取变量E的值,进行比较。如果大于0,跳转到 ADDITION 标签,如否则跳转到 SUBTRACTION 标签。
3. 在 ADDITION 和 SUBTRACTION 过程中,进行多字节加法和减法运算,并将结果存储到 D。

这个代码示例使用了 8086 汇编指令。您可以使用如 DOSBox 及其内的 MASM 或 TASM 汇编器进行编译和测试。希望这个例子能够帮助您理解如何在汇编语言中进行多字节计算。

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

使用道具 举报

 楼主| 发表于 2024-11-12 20:08:01 | 显示全部楼层
FishC 发表于 2024-11-12 19:59
这个问题是关于如何在汇编语言中实现多字节运算。下面是一个基于DOSBox(及其内的MASM/TASM)汇编语言的代 ...

dosbox怎么运行这段代码呀?生成了exe文件之后,如何看到结果呢?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2024-11-12 20:08:12 | 显示全部楼层
fish111 发表于 2024-11-12 20:08
dosbox怎么运行这段代码呀?生成了exe文件之后,如何 ...


要在 DOSBox 上运行并测试这段汇编代码,您需要进行以下几个步骤:

1. **安装 DOSBox 和 MASM/TASM**:
   - 如果尚未安装 DOSBox,请下载并安装 DOSBox。
   - 下载并解压 MASM 或 TASM 工具包,并且在 DOSBox 中配置好对应的目录。

2. **编写和编译汇编代码**:
   - 使用记事本或其他文本编辑器将上述汇编代码保存到一个.asm文件中。例如:`program.asm`。
   - 将 `.asm` 文件放置在您将在 DOSBox 中挂载的目录下。

3. **在 DOSBox 中挂载目录**:
   - 启动 DOSBox。
   - 在 DOSBox 中输入以下命令挂载包含您 `.asm` 文件的目录:
   
  1. mount c path_to_your_directory
  2.      c:
复制代码

   - 切换到挂载的目录:`c:`。

4. **编译汇编代码**:
   - 使用 MASM 或 TASM 编译该汇编代码:
   
  1. masm program.asm;  (对于 MASM)
  2.      link program.obj;   (对于 MASM)
复制代码

     或者使用 TASM:
   
  1. tasm program.asm  (对于 TASM)
  2.      tlink program.obj (对于 TASM)
复制代码


5. **运行编译后的可执行文件**:
   - 编译成功后,在 DOSBox 中运行生成的`.exe`文件:
   
  1. program.exe
复制代码


6. **查看结果**:
   - 要在程序执行完后查看结果,您可以在汇编代码中追加一段代码将内存中的值(比如D的值)输出到屏幕上。对于这种工作,可以使用 `int 21h` 来显示结果。例如,将 D 数组的每个字节的数据输出到屏幕,可以在代码末尾加入以下代码:

  1. DISPLAY_RESULT:
  2.     LEA SI, D            ; 加载 D 数组的地址到 SI
  3.     MOV CX, 4            ; 要显示的字节数
  4. PRINT_LOOP:
  5.     MOV AL, [SI]         ; 读取 D 数组的字节
  6.     ADD AL, 30H          ; 转换数值到字符
  7.     MOV DL, AL
  8.     MOV AH, 02H          ; int 21h 的显示功能
  9.     INT 21H              ; 显示字符
  10.     INC SI               ; 下一个字节
  11.     LOOP PRINT_LOOP

  12. END_PROGRAM:
  13.     MOV AX, 4C00H         ; 返回 DOS
  14.     INT 21H
复制代码


这样,程序运行后会在屏幕上显示 D 数组中每个字节的十六进制值。

通过这些步骤,您可以在 DOSBox 中编译、执行和查看汇编代码运行的结果。如果还有其他问题,请随时提问。

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

使用道具 举报

发表于 2024-11-12 20:51:41 | 显示全部楼层
  1. ASSUME DS:DATA , CS:CODE

  2. DATA SEGMENT

  3.     A DB 12H,34H,56H,78H
  4.     B DB 12H,34H,56H,78H
  5.     C DB 06H,07H,08H,09H
  6.     D DB ?,?,?,?
  7.     E DB 3

  8. DATA ENDS

  9. STACK SEGMENT STACK
  10.       DB 400H DUP(0)
  11. STACK ENDS

  12. CODE SEGMENT
  13. MAIN PROC FAR
  14.       MOV AX,DATA
  15.       MOV DS,AX
  16.       LEA SI,A
  17.       MOV CX,4
  18. LP01: PUSH CX
  19.       MOV AL,BYTE PTR[SI]       ; 读取1个 A
  20.       MOV BL,BYTE PTR[SI+4]     ; 读取1个 B
  21.       MOV DL,BYTE PTR[SI+8]     ; 读取1个 C
  22.       ADD AL,BL                 ; 先计算 A+B
  23.       CMP BYTE PTR[E],0         ; E > 0 ?
  24.       JA LP02                   ; Yes - Jump
  25.       SUB AL,DL                 ; E <= 0 计算 D=A+B-C
  26.       JMP SHORT LP03
  27. LP02: ADD AL,DL                 ; E > 0  计算 D=A+B+C
  28. LP03: MOV BYTE PTR[SI+12],AL    ; 保存 D
  29.       INC SI
  30.       POP CX
  31.       LOOP LP01
  32.       MOV AX,4C00H
  33.       INT 21H
  34. MAIN ENDP
  35. CODE ENDS
  36. END MAIN
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2024-11-12 22:12:03 | 显示全部楼层

dosbox软件怎么运行出来这段代码呀?我在dosbox里面已经把asm文件链接成obj文件了,然后生成了exe文件,然后就不知道怎么做了,帮帮我吧,能带上图片吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-18 14:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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