我在计算机科学课上遇到一个问题,要求从0h到100h写入DATA SEGMENT并且它正在工作一半,它会覆盖除EE到FF之外的每个单元格
Start:
mov ax, @data
mov ds, ax
mov si, 100h ; starting DATASEG
mov cx, 0h ; counting
mov al, 0FFh ; Number setting in each segment
loop1:
mov [si],al
dec si ; decrease location
inc cx ; increase counting
CMP cx,101h
jne loop1
结果:
答案 0 :(得分:1)
我认为@Michael找到了原因:SS
= DS
和你的SP=100h
,所以中断处理程序会破坏SP下方的空间。这是被覆盖的DS:00
.. DS:100h
范围的结尾。
即使是调试器本身也可能是部分侵入性的,并且在调试程序的SP
之下(例如当int3
指令推送异常返回信息时)。 (您在DOSBOX中运行TurboDebugger,而不是使用内置于DOSBOX或BOCHS的调试器;这样可以让您完全非侵入性地进行调试,但是当您没有时,定时器中断仍会在SP下面破坏中断禁用)。
所以你的代码工作正常,但它的结果被堆栈覆盖了。
答案 1 :(得分:0)
答案就是Peter Cordes发布的内容(并且你设法不显示导致问题的相关代码,问题中的代码是正确的,没有问题,但初始数据段和堆栈设置错误)
这就是为什么StackOverflow上的好调试问题需要Minimal, Complete, and Verifiable example。
我只是想补充一下,使用route
172.17.0.0 0.0.0.0 255.255.0.0 U 0 0 0 docker0
模式和'[
{
"Name": "bridge",
"Id": "d7c753e63270be9aae2af38ab1044966c066ad6e69fec0f95e28c7e3c850ff23",
"Created": "2017-12-01T08:08:51.677254348+01:00",
"Scope": "local",
"Driver": "bridge",
"EnableIPv6": false,
"IPAM": {
"Driver": "default",
"Options": null,
"Config": [
{
"Subnet": "172.17.0.0/16",
"Gateway": "172.17.0.1"
}
]
},
"Internal": false,
"Attachable": false,
"Ingress": false,
"ConfigFrom": {
"Network": ""
},
"ConfigOnly": false,
"Containers": {
"21bcc48764a7245a5f8ef851e3e16774e91d0447fac6fc614089b5b917b71b31": {
"Name": "angry_bassi",
"EndpointID": "c744a2a7f2596d743ed91756f846d455967bb634292190c69789b447cca5ca2d",
"MacAddress": "02:42:ac:11:00:02",
"IPv4Address": "172.17.0.2/16",
"IPv6Address": ""
}
},
"Options": {
"com.docker.network.bridge.default_bridge": "true",
"com.docker.network.bridge.enable_icc": "true",
"com.docker.network.bridge.enable_ip_masquerade": "true",
"com.docker.network.bridge.host_binding_ipv4": "0.0.0.0",
"com.docker.network.bridge.name": "docker0",
"com.docker.network.driver.mtu": "1500"
},
"Labels": {}
}
]
寻址,如何使用更简单的16b代码实现相同的结果:
rep stos
它仍会显示同样的问题,因为您的堆栈将覆盖数据段的那一部分,但它会更有效地设置数据集单元格。