汇编指令编写正确性咨询:MOV指令内存操作相关问题
分析你的汇编指令编写问题
先直接给结论:你对两个任务的指令编写都存在错误,核心问题是偏移地址计算时只取了低8位,忽略了偏移地址是16位的完整值,导致实际访问的物理地址和任务要求的目标地址不匹配。
任务一:将AL的值存入内存地址0BECAh
你的思路方向是对的——实模式下物理地址 = DS × 16 + 偏移地址,但计算偏移地址时出错了:
- DS=0B00h,DS×16(等价于左移4位)的结果是0B000h
- 目标物理地址是0BECAh,所以正确的偏移地址 = 0BECAh - 0B000h = 0ECAh(不是你截取的0CAh)
- 你写的
mov [0CAh], al实际访问的物理地址是0B000h + 00CAh = 0B0CAh,和任务要求的0BECAh完全不符 - 正确的指令应该是:
mov [0ECAh], al
任务二:将内存地址092A0h中的值存入BL
同样是偏移地址计算出现了截断错误:
- DS=0900h,DS×16的结果是09000h
- 目标物理地址是092A0h,正确的偏移地址 = 092A0h - 09000h = 02A0h(不是你写的0A0h)
- 你写的
mov bl,[A0h]实际访问的是09000h + 00A0h = 090A0h,并非任务要求的目标地址 - 正确的指令应该是:
mov bl,[02A0h]
补充个小知识点:x86实模式下,不管你访问的是字节单元(比如用AL/BL这类8位寄存器)还是字单元,偏移地址都是16位的完整值,不能随意截取低8位——只有当目标偏移地址本身在0000h~00FFh范围内时,写低8位才是正确的,否则一定会访问错误的内存位置。
内容的提问来源于stack exchange,提问作者inoi
相关产品推荐
相关产品推荐

