鱼C论坛

 找回密码
 立即注册
查看: 2060|回复: 14

[已解决]这个检测点这道题是不是出错了

[复制链接]
发表于 2022-5-10 21:06:06 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
捕获.JPG

a段和b段的相加,最后一个字节的数据存放在c:[8]中,岂不是会造成精度的损失?因为8+8的值是10H,进了一位的
最佳答案
2022-5-10 21:50:30
本帖最后由 jackz007 于 2022-5-10 21:52 编辑

        别人要求把 A、B 段 8 个字节对应相加然后对应保存到 C 段。结果是 8 个字节。
assume cs:code
a segment
    db 1,2,3,4,5,6,7,8
a ends
b segment
    db 1,2,3,4,5,6,7,8
b ends
c segment
    db 0,0,0,0,0,0,0,0
c ends
code segment
start:
    mov ax,a
    mov ds,ax
    mov cx,8
    xor bx,bx
s1:
    mov al,[bx]
    add al,[bx+10h]
    mov [bx+20h],al
    inc bx
    loop s1
    mov ax,4c00h
    int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-5-10 21:26:55 From FishC Mobile | 显示全部楼层
晕,没错,是我搞错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-10 21:28:02 From FishC Mobile | 显示全部楼层
十六进制的2位刚好可以用一个字节存放,我弄错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-10 21:50:30 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2022-5-10 21:52 编辑

        别人要求把 A、B 段 8 个字节对应相加然后对应保存到 C 段。结果是 8 个字节。
assume cs:code
a segment
    db 1,2,3,4,5,6,7,8
a ends
b segment
    db 1,2,3,4,5,6,7,8
b ends
c segment
    db 0,0,0,0,0,0,0,0
c ends
code segment
start:
    mov ax,a
    mov ds,ax
    mov cx,8
    xor bx,bx
s1:
    mov al,[bx]
    add al,[bx+10h]
    mov [bx+20h],al
    inc bx
    loop s1
    mov ax,4c00h
    int 21h
code ends
end start
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-11 00:17:09 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-5-10 21:50
别人要求把 A、B 段 8 个字节对应相加然后对应保存到 C 段。结果是 8 个字节。

你这代码循环体看不懂
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-11 00:20:37 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-5-10 21:50
别人要求把 A、B 段 8 个字节对应相加然后对应保存到 C 段。结果是 8 个字节。

循环体不应该是这样的么?
mov al,[bx]
add al,[bx+8h]
mov [bx+10h],al
inc bx
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-11 09:20:18 From FishC Mobile | 显示全部楼层
本帖最后由 jackz007 于 2022-5-11 09:25 编辑
竹逸 发表于 2022-5-11 00:20
循环体不应该是这样的么?
mov al,
add al,


       汇编语言的段在没有特殊指定的情况下,一定是按小节(16 字节)对齐的,例如,假如 A 段地址是 1000h,只占用了 8 个字节,那么,后续的 B 段会从什么地址开始呢?显然应该是 1001h,因为 1 是段地址增减的最小单位,尽管在代码中,A 段只需要 8 个字节空间,但是,编译器会实际为 A 段分配 16 个字节空间,依此类推, C 段地址是 1002h,code 段的地址是 1003h,而段地址每增减 1,其实就是偏移地址增减 10h(16 个字节)。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-11 10:08:22 | 显示全部楼层
jackz007 发表于 2022-5-11 09:20
汇编语言的段在没有特殊指定的情况下,一定是按小节(16 字节)对齐的,例如,假如 A 段地址是  ...

原来如此,现在明白了,我以前对内存理解的是 数据都是线性紧挨着存储的,如果一个段数据不足16个字节,那下一段就会接着上一个段的继续存储,这样两个段地址就一样的,区别只在于是偏移地址
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-18 21:30:23 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-5-11 09:20
汇编语言的段在没有特殊指定的情况下,一定是按小节(16 字节)对齐的,例如,假如 A 段地址是  ...

a,b,c这3个段都没有用assume声明,就可以在代码段里直接使用,那为啥code段却要assume一下啊,code段如果不assume,直接用cs指向code是不是也没问题呢?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-18 21:47:49 | 显示全部楼层
竹逸 发表于 2022-5-18 21:30
a,b,c这3个段都没有用assume声明,就可以在代码段里直接使用,那为啥code段却要assume一下啊,code段如果 ...

      你自己可以试一试,把 assume 伪指令去掉,编译看看,有什么不同。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-23 01:17:33 | 显示全部楼层
本帖最后由 竹逸 于 2022-5-23 01:20 编辑
jackz007 发表于 2022-5-10 21:50
别人要求把 A、B 段 8 个字节对应相加然后对应保存到 C 段。结果是 8 个字节。

s1:
        mov al,a:bx
        add al,b:bx
        mov d:bx,al
        inc bx
        loop s1
        mov ax,4c00h
        int 21h
code ends

大佬,我把循环体的内容改成这样就会报错,是什么原因呢?是寻址不能直接用段地址而要通过段寄存器才可以吗?

捕获.JPG
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-23 13:39:56 | 显示全部楼层
本帖最后由 jackz007 于 2022-5-23 13:43 编辑
竹逸 发表于 2022-5-23 01:17
大佬,我把循环体的内容改成这样就会报错,是什么原因呢?是寻址不能直接用段地址而要通过段寄存器 ...


       我只能说,用别人的语言写代码咱就得遵守别人的规则,我想问你,这么写代码,你遵守别人的规则了吗?
      
       你可以用 assume 伪指令来把数据段和段寄存器绑定起来,这样,当你在存取相关段内的数据时,编译器就会自动为你的代码添加相应段前缀(CS、DS、ES、SS)的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-5-23 19:15:54 From FishC Mobile | 显示全部楼层
jackz007 发表于 2022-5-23 13:39
我只能说,用别人的语言写代码咱就得遵守别人的规则,我想问你,这么写代码,你遵守别人的规则 ...

我可以把段名看成是一个指针变量么
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-23 20:24:27 From FishC Mobile | 显示全部楼层
竹逸 发表于 2022-5-23 19:15
我可以把段名看成是一个指针变量么

        不可以,段地址相对固定,段寄存器其实就锚定一个基址,编译器会根据变量的段内偏移来定位和确定变量的存储地址。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-5-24 17:11:29 | 显示全部楼层
本帖最后由 jackz007 于 2022-5-24 17:18 编辑
竹逸 发表于 2022-5-23 19:15
我可以把段名看成是一个指针变量么


        编译、调试这个代码,你就可以体会到段及 assume 伪指令的意义和作用。
assume cs:code , ss:a , es:b , ds:c

a segment stack para 'stack'
    ta db 1,2,3,4,5,6,7,8
    dw 400h dup(00)
a ends

b segment para public 'data'
    tb db 1,2,3,4,5,6,7,8
b ends

c segment para public 'data'
    tc db 0,0,0,0,0,0,0,0
c ends

code segment para public 'code'
start:
    mov ax,b
    mov es,ax
    mov ax,c
    mov ds,ax
    xor bx,bx
    mov cx,8
s1: mov al , byte ptr ta[bx] ; 在debug 中重点关注该指令的形式
    add al , byte ptr tb[bx] ; 在debug 中重点关注该指令的形式
    mov byte ptr tc[bx],al   ; 在debug 中重点关注该指令的形式
    inc bx
    loop s1
    mov ax,4c00h
    int 21h
code ends
end start
        你可以试试调整 assume 伪指令中,a、b、c 段与 ss、ds、es 寄存器的对应关系,观察被标注那三条指令形式的变化。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-12-22 23:40

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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