鱼C论坛

 找回密码
 立即注册
查看: 618|回复: 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的汇编代码如下:
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]     ; 从FFFF0h+SI(源地址)处读取一个字节到AL寄存器        MOV [DI], 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 ENDSEND
题目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 [DI], AL            ; 将AL寄存器的值写入目标地址        INC DI                  ; 目标地址偏移量自增1        LOOP L1    MOV AH, 4Ch    INT 21hDATA SEGMENT    DB 16 DUP(0)DATA ENDSEND
题目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]        ; 从SI(源地址)处读取一个字节到AL寄存器        MOV BL, [DI]        ; 从DI(目标地址)处读取一个字节到BL寄存器        AND AL, 0Fh         ; 将AL寄存器的低4位保留,高4位清零        SHR BL, 4           ; 将BL寄存器右移4位,保留高4位,低4位清零        OR AL, BL           ; 将AL寄存器的低4位与BL寄存器的高4位进行或操作,得到新的字节        MOV [DI], AL        ; 将AL寄存器的值写入DI(目标地址)处        INC SI              ; 源地址偏移量自增1        INC DI              ; 目标地址偏移量自增1        INC DI              ; 目标地址偏移量再自增1(跳过B800h~B800Fh的空间)        LOOP L1             ; 循环,直到CX寄存器的值为0    MOV AH, 4Ch    INT 21hDATA SEGMENT    DB 16 DUP(0)DATA ENDSEND

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

使用道具 举报

发表于 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]     ; 从FFFF0h+SI(源地址)处读取一个字节到AL寄存器        MOV [DI], 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 ENDSEND
题目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 [DI], AL            ; 将AL寄存器的值写入目标地址        INC DI                  ; 目标地址偏移量自增1        LOOP L1    MOV AH, 4Ch    INT 21hDATA SEGMENT    DB 16 DUP(0)DATA ENDSEND
题目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]        ; 从SI(源地址)处读取一个字节到AL寄存器        MOV BL, [DI]        ; 从DI(目标地址)处读取一个字节到BL寄存器        AND AL, 0Fh         ; 将AL寄存器的低4位保留,高4位清零        SHR BL, 4           ; 将BL寄存器右移4位,保留高4位,低4位清零        OR AL, BL           ; 将AL寄存器的低4位与BL寄存器的高4位进行或操作,得到新的字节        MOV [DI], AL        ; 将AL寄存器的值写入DI(目标地址)处        INC SI              ; 源地址偏移量自增1        INC DI              ; 目标地址偏移量自增1        INC DI              ; 目标地址偏移量再自增1(跳过B800h~B800Fh的空间)        LOOP L1             ; 循环,直到CX寄存器的值为0    MOV AH, 4Ch    INT 21hDATA SEGMENT    DB 16 DUP(0)DATA ENDSEND

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

使用道具 举报

 楼主| 发表于 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, [ax + SI]     ; 从FFFF0h+SI(源地址)处读取一个字节到AL寄存器
        MOV [DI], 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”错误。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 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 segmentstart:    MOV AX, data            ; 将数据段地址加载到AX寄存器    MOV DS, AX              ; 将DS寄存器设置为数据段地址    MOV SI, FFFF0H          ; 设置源地址的偏移量为FFFF0H    MOV DI, 0               ; 将DI寄存器清零,作为目标地址的偏移量    MOV CX, 16              ; 设置循环次数,一共需要复制16个字节的数据L1:    MOV AL, [SI]            ; 从[FFFF0H+SI](源地址)处读取一个字节到AL寄存器    MOV [DI], AL            ; 将AL寄存器的值写入到[DI](目标地址)处    INC SI                  ; 源地址偏移量自增1    INC DI                  ; 目标地址偏移量自增1    LOOP L1                 ; 循环,直到CX寄存器的值为0    MOV AH, 4Ch             ; 结束程序    INT 21hcode endsend 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-11-21 23:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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