- Assembly code
assume cs:codesg,ds:datadata segmentdb 'BaSIC'db 'iNfOrMaTiOn'db 0,0,0,0,0data endscodesg segmentstart:mov ax,datamov ds,axsub bx,bxmov cx,11mov ds:[20h],cx mov cx,5mov si,0s:mov al,ds:[bx+si]or al,100000Bmov ds:[bx+si],alinc siloop smov cx,ds:[20h]add bx,16sub si,sis0:mov al,ds:[bx+si]and al,11011111Bmov ds:[bx+si],alinc siloop s0mov ax,4c00hint 21hcodesg endsend start
这段代码是将第一个字符串变为小写字母,用变位弄的,第二个相反,变为大写字母,但是上面两个字符串是连续的。
- Assembly code
assume cs:codea segment db 1,2,3,4,5,6,7,8a endsb segment db 1,2,3,4,5,6,7,8b endsc segment db 0,0,0,0,0,0,0,0c endscode segmentstart: mov ax,a mov ds,ax mov ax,0 mov bx,0 mov cx,8s:add al,[bx] add al,[bx+16] mov [bx+32],al inc bx loop smov ax,4c00hint 21hcode endsend start
这段代码则不是连续的,a,b,c占据的空间各是16字节,不是连续的,后面都有空格,为什么?两者区别在哪,怎么判定?
------解决方案--------------------------------------------------------
因为第一段两个字符串在一个segment里面
我的意思是每个segment的第一字节的地址要是16的倍数,segment内部的不管
------解决方案--------------------------------------------------------
在同一个段内,若没有重定位的伪指令,总是连续分配内存单元的。 对于新的段,若无定位说明,会找下一个10H倍数的物理地址开始分配新段中的单元,这样可能会跳过而不使用前一个段中的某些单元。
汇编的寻址尽量不去人为计算,如果字符串改为
data segment
db 'BaSIChjUIYUIHhHUIuiGyGyuFTydfTDIOJioHoihiohhgyiugFYUyT'
db 'iNfOrMaTiOn'
db 0,0,0,0,0
data ends
那你 add bx,?呢。 要慢慢学会使用变量名,如
data segment
str1 db 'BaSIChjUIYUIHhHUIuiGyGyuFTydfTDIOJioHoihiohhgyiugFYUyT'
str2 db 'iNfOrMaTiOn'
str3 db 0,0,0,0,0
data ends
等。