题目1
编程:向内存0:200 - 0:23F 中存放数据 0 - 3FH
; 向内存 0:200 ~ 0:23f 写入数据0~3fH【字节型数据】
assume cs:code
code segmentstart:mov ax,0mov ds,axmov bx,0200H ; 偏移地址mov al,0 ; 数据mov cx,03fH+1H ; 0 ~ 3FH 共 (3F + 1)Hs:mov [bx],alinc bxinc alloop smov ax,04c00hint 021h
code ends
end start
注意要点:
- 写入的是字节型数据
- 注意循环次数
题目2
优化题目一代码,只能使用9条指令,包括最后两条返回指令
也就是说,汇编指令只能有7条。
优化思路:必要的设置ds的2条、loop s
1条和inc bx
1条,不可能减少。
那就只能:寄存器共用,结果如下:
; 向内存 0:200 ~ 0:23f 写入数据0~3fH【字节型数据】
assume cs:code
code segmentstart:mov ax,0mov ds,axmov bx,0H ; 偏移地址mov cx,03fH+1H ; 0 ~ 3FH 共 (3F + 1)Hs:mov [bx + 200H],blinc bxloop smov ax,04c00hint 021h
code ends
end start
思路来源: 所谓的基址寻址[bx + 常量]
,其实这个名字没什么用,只需要知道,EA的来源可以是xxx的组合就好了,这些名字徒增记忆负担。
题目3
将代码段在
mov ax,04c00h
之前的数据,放到其他内存空间中,起点是0:200
assume cs:code
code segmentstart:mov ax,codemov ds,axmov ax,0mov ss,axmov bx,0sub cx,5 ; 减去返回指令的值s:mov dl,[bx] ; “[]”中可以是bx,bp,si,di,常数【不能是ax!】mov ss:[bx + 200H],dl ; 不能2个操作数都是内存单元inc bxloop smov ax,04c00hint 021h
code ends
end start
- x86指令集中,操作数中【至多有一个】内存单元
- 存储器寻址:是
bx,bp,si,di,常数
这几种的组合 - 段寄存器赋值的标准写法
mov ax,datasg
mov ds,ax
xor ss,ss
,xor也是运算符,凡是运算,段寄存器都不能参与!- 加载之初,cx的值,就是汇编指令对应的机器数的大小,对于这道题是可以的,但是如果还有其他的段,那么,这道题其实没有什么意义,只不过王爽老师是故意知识屏蔽的,对初学者友好!