哈哈哈0 发表于 2023-12-20 22:14:33

汇编题目

题目1、将物理地址为ffff0~fffff的16字节数据复制到自定义数据段data中的【0】~【f】单元空间。

题目2、在自定义数据段data中的【10】~【1f】空间依次写入A~P等16个字母。

题目3、将按照【0】【10】、【1】【11】、【【2】12】、。。。。【f】【1f】的关系组合成新的字数据,存入到物理地址为B8000~B801F的内存空间。

FishC 发表于 2023-12-20 22:14:48

题目1的汇编代码如下:

ORG 100h         ; 设置程序起始地址为100h

    MOV AX, DATA    ; 将数据段地址加载到AX寄存器
    MOV DS, AX      ; 将DS寄存器设置为数据段地址

    XOR SI, SI      ; 将SI寄存器清零,作为源地址的偏移量
    MOV DI, 0       ; 将DI寄存器清零,作为目标地址的偏移量

    MOV CX, 16      ; 设置循环次数,一共需要复制16个字节的数据

    L1:
      MOV AL,    ; 从FFFF0h+SI(源地址)处读取一个字节到AL寄存器
      MOV , AL            ; 将AL寄存器的值写入到DI(目标地址)处
      INC SI                  ; 源地址偏移量自增1
      INC DI                  ; 目标地址偏移量自增1
      LOOP L1               ; 循环,直到CX寄存器的值为0

    MOV AH, 4Ch   ; 结束程序
    INT 21h

; 数据段定义
DATA SEGMENT
    DB 16 DUP(0)   ; 定义16字节的空间,用于存放复制的数据
DATA ENDS

END

题目2的汇编代码如下:

ORG 100h

    MOV AX, DATA
    MOV DS, AX

    MOV DI, 10h   ; 设置目标地址的偏移量为10h

    MOV CX, 16      ; 设置循环次数,需要写入16个字母

    L1:
      MOV AL, 'A' + (DI-10h)   ; 将字母依次存入AL寄存器
      MOV , AL            ; 将AL寄存器的值写入目标地址
      INC DI                  ; 目标地址偏移量自增1
      LOOP L1

    MOV AH, 4Ch
    INT 21h

DATA SEGMENT
    DB 16 DUP(0)
DATA ENDS

END

题目3的汇编代码如下:

ORG 100h

    MOV AX, DATA
    MOV DS, AX

    XOR SI, SI      ; 清零SI寄存器,作为源地址的偏移量
    MOV DI, B800h   ; 将DI寄存器设置为目标地址的偏移量

    MOV CX, 16      ; 设置循环次数,一共需要组合16个字节的新数据

    L1:
      MOV AL,       ; 从SI(源地址)处读取一个字节到AL寄存器
      MOV BL,       ; 从DI(目标地址)处读取一个字节到BL寄存器
      AND AL, 0Fh         ; 将AL寄存器的低4位保留,高4位清零
      SHR BL, 4         ; 将BL寄存器右移4位,保留高4位,低4位清零
      OR AL, BL         ; 将AL寄存器的低4位与BL寄存器的高4位进行或操作,得到新的字节
      MOV , AL      ; 将AL寄存器的值写入DI(目标地址)处
      INC SI            ; 源地址偏移量自增1
      INC DI            ; 目标地址偏移量自增1
      INC DI            ; 目标地址偏移量再自增1(跳过B800h~B800Fh的空间)
      LOOP L1             ; 循环,直到CX寄存器的值为0

    MOV AH, 4Ch
    INT 21h

DATA SEGMENT
    DB 16 DUP(0)
DATA ENDS

END

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。

哈哈哈0 发表于 2023-12-25 20:37:03

FishC 发表于 2023-12-20 22:14
题目1的汇编代码如下:



data segment
    DB 16 DUP(0)
data ends
assume cs:code, ds:data

code segment
start:
    MOV AX, DATA    ; 将数据段地址加载到AX寄存器
    MOV DS, AX      ; 将DS寄存器设置为数据段地址
        mov ax, ffff0h;
    XOR SI, SI      ; 将SI寄存器清零,作为源地址的偏移量
    MOV DI, 0       ; 将DI寄存器清零,作为目标地址的偏移量
    MOV CX, 16      ; 设置循环次数,一共需要复制16个字节的数据
    L1:
      MOV AL,    ; 从FFFF0h+SI(源地址)处读取一个字节到AL寄存器
      MOV , AL            ; 将AL寄存器的值写入到DI(目标地址)处
      INC SI                  ; 源地址偏移量自增1
      INC DI                  ; 目标地址偏移量自增1
      LOOP L1               ; 循环,直到CX寄存器的值为0
               
    MOV AH, 4Ch   ; 结束程序
    INT 21h
        code ends
end start

这样子写,怎么报错了。报”Symbol not defined: FFFF0H”错误。

FishC 发表于 2023-12-25 20:37:20

哈哈哈0 发表于 2023-12-25 20:37
data segment
    DB 16 DUP(0)
data ends
assume...

汇编代码中报错是因为FFFF0H作为一个物理地址,在代码中没有定义。如果你想要复制的数据位于该物理地址,可以使用段前缀来指定。请修改代码如下:
data segment
    DB 16 DUP(0)
data ends
   
code segment
start:
    MOV AX, data            ; 将数据段地址加载到AX寄存器
    MOV DS, AX            ; 将DS寄存器设置为数据段地址
    MOV SI, FFFF0H          ; 设置源地址的偏移量为FFFF0H
    MOV DI, 0               ; 将DI寄存器清零,作为目标地址的偏移量
    MOV CX, 16            ; 设置循环次数,一共需要复制16个字节的数据
L1:
    MOV AL,             ; 从(源地址)处读取一个字节到AL寄存器
    MOV , AL            ; 将AL寄存器的值写入到(目标地址)处
    INC SI                  ; 源地址偏移量自增1
    INC DI                  ; 目标地址偏移量自增1
    LOOP L1               ; 循环,直到CX寄存器的值为0
    MOV AH, 4Ch             ; 结束程序
    INT 21h
code ends
end start
第一行将`MOV AX, DATA`修改为`MOV AX, data`,并将第二行的`MOV DS, AX`与其对齐,保证大小写一致。同时将`XOR SI, SI`修改为`MOV SI, FFFF0H`,并在复制时使用方括号`[]`进行间接寻址。最后将代码结束标记修改为`end start`。

这样修改后的代码应该可以正常执行了。

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
页: [1]
查看完整版本: 汇编题目