鱼C论坛

 找回密码
 立即注册
查看: 347|回复: 3

[已解决]汇编题目

[复制链接]
发表于 2023-12-20 22:14:33 | 显示全部楼层 |阅读模式

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

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

x
题目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的内存空间。
最佳答案
2023-12-20 22:14:48
题目1的汇编代码如下:
  1. ORG 100h         ; 设置程序起始地址为100h
  2.     MOV AX, DATA    ; 将数据段地址加载到AX寄存器
  3.     MOV DS, AX      ; 将DS寄存器设置为数据段地址
  4.     XOR SI, SI      ; 将SI寄存器清零,作为源地址的偏移量
  5.     MOV DI, 0       ; 将DI寄存器清零,作为目标地址的偏移量
  6.     MOV CX, 16      ; 设置循环次数,一共需要复制16个字节的数据
  7.     L1:
  8.         MOV AL, [FFFF0h+SI]     ; 从FFFF0h+SI(源地址)处读取一个字节到AL寄存器
  9.         MOV [DI], AL            ; 将AL寄存器的值写入到DI(目标地址)处
  10.         INC SI                  ; 源地址偏移量自增1
  11.         INC DI                  ; 目标地址偏移量自增1
  12.         LOOP L1                 ; 循环,直到CX寄存器的值为0
  13.     MOV AH, 4Ch     ; 结束程序
  14.     INT 21h
  15. ; 数据段定义
  16. DATA SEGMENT
  17.     DB 16 DUP(0)   ; 定义16字节的空间,用于存放复制的数据
  18. DATA ENDS
  19. END
复制代码

题目2的汇编代码如下:
  1. ORG 100h
  2.     MOV AX, DATA
  3.     MOV DS, AX
  4.     MOV DI, 10h     ; 设置目标地址的偏移量为10h
  5.     MOV CX, 16      ; 设置循环次数,需要写入16个字母
  6.     L1:
  7.         MOV AL, 'A' + (DI-10h)   ; 将字母依次存入AL寄存器
  8.         MOV [DI], AL            ; 将AL寄存器的值写入目标地址
  9.         INC DI                  ; 目标地址偏移量自增1
  10.         LOOP L1
  11.     MOV AH, 4Ch
  12.     INT 21h
  13. DATA SEGMENT
  14.     DB 16 DUP(0)
  15. DATA ENDS
  16. END
复制代码

题目3的汇编代码如下:
  1. ORG 100h
  2.     MOV AX, DATA
  3.     MOV DS, AX
  4.     XOR SI, SI      ; 清零SI寄存器,作为源地址的偏移量
  5.     MOV DI, B800h   ; 将DI寄存器设置为目标地址的偏移量
  6.     MOV CX, 16      ; 设置循环次数,一共需要组合16个字节的新数据
  7.     L1:
  8.         MOV AL, [SI]        ; 从SI(源地址)处读取一个字节到AL寄存器
  9.         MOV BL, [DI]        ; 从DI(目标地址)处读取一个字节到BL寄存器
  10.         AND AL, 0Fh         ; 将AL寄存器的低4位保留,高4位清零
  11.         SHR BL, 4           ; 将BL寄存器右移4位,保留高4位,低4位清零
  12.         OR AL, BL           ; 将AL寄存器的低4位与BL寄存器的高4位进行或操作,得到新的字节
  13.         MOV [DI], AL        ; 将AL寄存器的值写入DI(目标地址)处
  14.         INC SI              ; 源地址偏移量自增1
  15.         INC DI              ; 目标地址偏移量自增1
  16.         INC DI              ; 目标地址偏移量再自增1(跳过B800h~B800Fh的空间)
  17.         LOOP L1             ; 循环,直到CX寄存器的值为0
  18.     MOV AH, 4Ch
  19.     INT 21h
  20. DATA SEGMENT
  21.     DB 16 DUP(0)
  22. DATA ENDS
  23. END
复制代码


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

使用道具 举报

发表于 2023-12-20 22:14:48 | 显示全部楼层    本楼为最佳答案   
题目1的汇编代码如下:
  1. ORG 100h         ; 设置程序起始地址为100h
  2.     MOV AX, DATA    ; 将数据段地址加载到AX寄存器
  3.     MOV DS, AX      ; 将DS寄存器设置为数据段地址
  4.     XOR SI, SI      ; 将SI寄存器清零,作为源地址的偏移量
  5.     MOV DI, 0       ; 将DI寄存器清零,作为目标地址的偏移量
  6.     MOV CX, 16      ; 设置循环次数,一共需要复制16个字节的数据
  7.     L1:
  8.         MOV AL, [FFFF0h+SI]     ; 从FFFF0h+SI(源地址)处读取一个字节到AL寄存器
  9.         MOV [DI], AL            ; 将AL寄存器的值写入到DI(目标地址)处
  10.         INC SI                  ; 源地址偏移量自增1
  11.         INC DI                  ; 目标地址偏移量自增1
  12.         LOOP L1                 ; 循环,直到CX寄存器的值为0
  13.     MOV AH, 4Ch     ; 结束程序
  14.     INT 21h
  15. ; 数据段定义
  16. DATA SEGMENT
  17.     DB 16 DUP(0)   ; 定义16字节的空间,用于存放复制的数据
  18. DATA ENDS
  19. END
复制代码

题目2的汇编代码如下:
  1. ORG 100h
  2.     MOV AX, DATA
  3.     MOV DS, AX
  4.     MOV DI, 10h     ; 设置目标地址的偏移量为10h
  5.     MOV CX, 16      ; 设置循环次数,需要写入16个字母
  6.     L1:
  7.         MOV AL, 'A' + (DI-10h)   ; 将字母依次存入AL寄存器
  8.         MOV [DI], AL            ; 将AL寄存器的值写入目标地址
  9.         INC DI                  ; 目标地址偏移量自增1
  10.         LOOP L1
  11.     MOV AH, 4Ch
  12.     INT 21h
  13. DATA SEGMENT
  14.     DB 16 DUP(0)
  15. DATA ENDS
  16. END
复制代码

题目3的汇编代码如下:
  1. ORG 100h
  2.     MOV AX, DATA
  3.     MOV DS, AX
  4.     XOR SI, SI      ; 清零SI寄存器,作为源地址的偏移量
  5.     MOV DI, B800h   ; 将DI寄存器设置为目标地址的偏移量
  6.     MOV CX, 16      ; 设置循环次数,一共需要组合16个字节的新数据
  7.     L1:
  8.         MOV AL, [SI]        ; 从SI(源地址)处读取一个字节到AL寄存器
  9.         MOV BL, [DI]        ; 从DI(目标地址)处读取一个字节到BL寄存器
  10.         AND AL, 0Fh         ; 将AL寄存器的低4位保留,高4位清零
  11.         SHR BL, 4           ; 将BL寄存器右移4位,保留高4位,低4位清零
  12.         OR AL, BL           ; 将AL寄存器的低4位与BL寄存器的高4位进行或操作,得到新的字节
  13.         MOV [DI], AL        ; 将AL寄存器的值写入DI(目标地址)处
  14.         INC SI              ; 源地址偏移量自增1
  15.         INC DI              ; 目标地址偏移量自增1
  16.         INC DI              ; 目标地址偏移量再自增1(跳过B800h~B800Fh的空间)
  17.         LOOP L1             ; 循环,直到CX寄存器的值为0
  18.     MOV AH, 4Ch
  19.     INT 21h
  20. DATA SEGMENT
  21.     DB 16 DUP(0)
  22. DATA ENDS
  23. END
复制代码


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

使用道具 举报

 楼主| 发表于 2023-12-25 20:37:03 | 显示全部楼层
FishC 发表于 2023-12-20 22:14
题目1的汇编代码如下:
  1. data segment
  2.     DB 16 DUP(0)
  3. data ends
  4. assume cs:code, ds:data

  5. code segment
  6. start:
  7.     MOV AX, DATA    ; 将数据段地址加载到AX寄存器
  8.     MOV DS, AX      ; 将DS寄存器设置为数据段地址
  9.         mov ax, ffff0h;
  10.     XOR SI, SI      ; 将SI寄存器清零,作为源地址的偏移量
  11.     MOV DI, 0       ; 将DI寄存器清零,作为目标地址的偏移量
  12.     MOV CX, 16      ; 设置循环次数,一共需要复制16个字节的数据
  13.     L1:
  14.         MOV AL, [ax + SI]     ; 从FFFF0h+SI(源地址)处读取一个字节到AL寄存器
  15.         MOV [DI], AL            ; 将AL寄存器的值写入到DI(目标地址)处
  16.         INC SI                  ; 源地址偏移量自增1
  17.         INC DI                  ; 目标地址偏移量自增1
  18.         LOOP L1                 ; 循环,直到CX寄存器的值为0
  19.                
  20.     MOV AH, 4Ch     ; 结束程序
  21.     INT 21h
  22.         code ends
  23. end start
复制代码


这样子写,怎么报错了。报  ”Symbol not defined: FFFF0H”错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-12-25 20:37:20 | 显示全部楼层
哈哈哈0 发表于 2023-12-25 20:37
data segment
    DB 16 DUP(0)
data ends
assume  ...

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

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

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

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-28 11:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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