fish111 发表于 2024-11-12 19:58:55

dosbox

编程实现:

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(多字节运算)(按高高低低的原则存储)
帮帮我,这个怎么写呀?

FishC 发表于 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 的字节
      ADD BL,           ; 加上 B 的字节,加上 CARRY(包含在 ADD 中,如果发生进位)
      ADC BL,           ; 加上 C 的字节,加上 CARRY
      MOV , 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 的字节
      ADD BL,           ; 加上 B 的字节
      SBB BL,           ; 减去 C 的字节,考虑 Borrow
      MOV , 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 小助理,如未能正确解答您的问题,请继续追问。

fish111 发表于 2024-11-12 20:08:01

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

dosbox怎么运行这段代码呀?生成了exe文件之后,如何看到结果呢?

FishC 发表于 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,          ; 读取 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 小助理,如未能正确解答您的问题,请继续追问。

jackz007 发表于 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       ; 读取1个 A
      MOV BL,BYTE PTR   ; 读取1个 B
      MOV DL,BYTE PTR   ; 读取1个 C
      ADD AL,BL               ; 先计算 A+B
      CMP BYTE PTR,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,AL    ; 保存 D
      INC SI
      POP CX
      LOOP LP01
      MOV AX,4C00H
      INT 21H
MAIN ENDP
CODE ENDS
END MAIN

fish111 发表于 2024-11-12 22:12:03

jackz007 发表于 2024-11-12 20:51


dosbox软件怎么运行出来这段代码呀?我在dosbox里面已经把asm文件链接成obj文件了,然后生成了exe文件,然后就不知道怎么做了,帮帮我吧,能带上图片吗?
页: [1]
查看完整版本: dosbox