鱼C论坛

 找回密码
 立即注册
查看: 206|回复: 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(多字节运算)(按高高低低的原则存储)
帮帮我,这个怎么写呀?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

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

.CODE
START:
    MOV AX, @DATA
    MOV DS, AX
    MOV ES, AX

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

ADDITION:
    XOR SI, SI                    ; SI 清零,用于 index
    XOR DI, DI                    ; DI 清零,用于 index
    XOR AL, AL                    ; AL 清零,用于存储 CARRY
    XOR AH, AH                    ; AH 清零,用于 CARRY

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

    JMP END_PROGRAM               ; 跳转到程序结束

SUBTRACTION:
    XOR SI, SI                    ; SI 清零,用于 index
    XOR DI, DI                    ; DI 清零,用于 index
    XOR AL, AL                    ; AL 清零,用于存储 BORROW
    XOR AH, AH                    ; AH 清零,用于 BORROW (CARRY的相反)

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

    JMP END_PROGRAM               ; 跳转到程序结束

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

END START

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

dosbox怎么运行这段代码呀?生成了exe文件之后,如何看到结果呢?
想知道小甲鱼最近在做啥?请访问 -> 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` 文件的目录:
   
mount c path_to_your_directory
     c:
   - 切换到挂载的目录:`c:`。

4. **编译汇编代码**:
   - 使用 MASM 或 TASM 编译该汇编代码:
   
masm program.asm;  (对于 MASM)
     link program.obj;   (对于 MASM)
     或者使用 TASM:
   
tasm program.asm  (对于 TASM)
     tlink program.obj (对于 TASM)

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

6. **查看结果**:
   - 要在程序执行完后查看结果,您可以在汇编代码中追加一段代码将内存中的值(比如D的值)输出到屏幕上。对于这种工作,可以使用 `int 21h` 来显示结果。例如,将 D 数组的每个字节的数据输出到屏幕,可以在代码末尾加入以下代码:
DISPLAY_RESULT:
    LEA SI, D            ; 加载 D 数组的地址到 SI
    MOV CX, 4            ; 要显示的字节数
PRINT_LOOP:
    MOV AL, [SI]         ; 读取 D 数组的字节
    ADD AL, 30H          ; 转换数值到字符
    MOV DL, AL
    MOV AH, 02H          ; int 21h 的显示功能
    INT 21H              ; 显示字符
    INC SI               ; 下一个字节
    LOOP PRINT_LOOP

END_PROGRAM:
    MOV AX, 4C00H         ; 返回 DOS
    INT 21H

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

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

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

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

STACK SEGMENT STACK
      DB 400H DUP(0)
STACK ENDS

CODE SEGMENT
MAIN PROC FAR
      MOV AX,DATA
      MOV DS,AX
      LEA SI,A
      MOV CX,4
LP01: PUSH CX
      MOV AL,BYTE PTR[SI]       ; 读取1个 A
      MOV BL,BYTE PTR[SI+4]     ; 读取1个 B
      MOV DL,BYTE PTR[SI+8]     ; 读取1个 C
      ADD AL,BL                 ; 先计算 A+B
      CMP BYTE PTR[E],0         ; E > 0 ?
      JA LP02                   ; Yes - Jump
      SUB AL,DL                 ; E <= 0 计算 D=A+B-C
      JMP SHORT LP03
LP02: ADD AL,DL                 ; E > 0  计算 D=A+B+C
LP03: MOV BYTE PTR[SI+12],AL    ; 保存 D
      INC SI
      POP CX
      LOOP LP01
      MOV AX,4C00H
      INT 21H
MAIN ENDP
CODE ENDS
END MAIN
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-12-21 21:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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