今天是2018年4月3号,早晨起来怼了一波代码:
data segment
str1 db 10,?,11 dup(?)
data ends
code segment
assume cs:code,ds:data
start:mov ax,data
mov ds,ax
mov ax,seg str1
mov ds,ax
lea dx,str1
mov ah,0ah
int 21h
mov bl,str1+1;(刚开始写成了mov bl,str+1 少了一个1,结果报错 大致意思是“str是CPU里的关键字”)
mov bh,0
mov al,'$'
mov [bx+2],al;(刚开始直接写成了mov [bx+2],'$',或者把这句和上句删掉改为 mov byte ptr[bx+2],'$')
(这里还有一个重点:[bx+2]是存储单元,系统在编译时把它的类型与后面的 寄存器类型 相匹配,例如:mov [bx+2],ax则[bx+2]为字单元。)
mov dl,0dh
mov ah,2
int 21h
mov dl,0ah
mov ah,2
int 21h
lea dx,str1+2
mov ah,9
int 21h
mov ah,4ch
int 21h
code ends
end start
上面的两处错误源于粗心大意以及对存储器寻址概念的模糊。
关于存储器寻址方式
1,存储器直接寻址 mov ax,ds:[偏移地址]
2,间接 mov ax,ds:[间址寄存器(bx,si,di)]
mov ax,ss:[bp]
3,相对 mov ax,ds:[(bx,si,di)+偏移量]
mov ax,ss:[bp+偏移量]
4,基址变址 mov ax,ds:[bx+(si,di)]
mov ax,ss:[bp+(si,di)]
5,相对基址变址 mov ax,ds:[bx+(si,di)+偏移量]
mov ax,ss:[bp+(si,di)+偏移量]