ranbo_q 发表于 2017-5-21 23:13:57

实验四---------欢迎大家共同讨论

4.1-4.2
assume cs:code
code segment

start:        mov ax, 20H                ;(ax) = 20H
                mov ds, ax                 ;设置段地址 (ds) = (ax)
                mov bx, 0                ;(bx) = 0 清空bx寄存器里面的值,用于存储偏移地址及变量 配合段地址ds
                mov cx, 64                ;(cx) = 64 用于存储循环变量 64次 配合loop使用
        s:        mov ds:, bl        ;开始循环,用Bl低8位存放数据在ds:内存单元中 ((ds)*16+(bx)) = (bl)
                inc bx                        ;(bx) = (bx)
                loop s                        ;跳转指令
                mov ax, 4c00H       
                int 21H
code ends
end start
4.3
assume cs:code
code segment

start:                mov ax,0BA6H                ;3字节    这个地址每台计算机都不一样
                mov ds,ax                ;2字节
                mov ax,0020h                ;3字节
                mov es,ax                ;2字节
                mov bx,0                        ;3字节
                mov cx,24                ;3字节
        s:        mov al,                ;2+1 字节
                mov es:,al                ;2字节
                inc bx                        ;1字节
                loop s                        ;2字节
                mov ax,4c00H       
                int 21H
code ends
end start

复制的是 mov ax,0BA6H 至 loop s 的代码段,0BA6:0H ~ 0BA6:18H 地址
赋值的是二进制数据(这里也不太肯定),有24个字节,先把程序写好编译好,debug 程序,利用 -u 0BA6H:0查看汇编代码有多少个字节,然后自己算一下

gang19840815 发表于 2020-2-12 22:05:46

有一个疑问 0:200~0:23F是怎么变成20:0~20:3F0:200 这不是0段吗 20:0 不是20段吗怎么转换的

学到秃为止 发表于 2020-3-15 17:11:42

gang19840815 发表于 2020-2-12 22:05
有一个疑问 0:200~0:23F是怎么变成20:0~20:3F0:200 这不是0段吗 20:0 不是20段吗怎么转换的

物理地址=段地址*16(相当于左移一位/后面加个0)+偏移地址
0:200=0*16+200=200
20:0=20(16进制)*16+0=200
所以这两个是一样的
页: [1]
查看完整版本: 实验四---------欢迎大家共同讨论