装配商店到DATA段并非全部显示

时间:2017-12-01 11:46:11

标签: assembly x86-16 tasm

我在计算机科学课上遇到一个问题,要求从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

结果:

enter image description here

2 个答案:

答案 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

它仍会显示同样的问题,因为您的堆栈将覆盖数据段的那一部分,但它会更有效地设置数据集单元格。