汇编题目
题目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的内存空间。 题目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 小助理,如未能正确解答您的问题,请继续追问。 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”错误。 哈哈哈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]