汇编语言 DOSBox

一 基础知识 

计算机的结构:

cpu里面的是寄存器,内存在cpu外面。内存中有一些东西,比如指令、数据等等。我们通过某一寄存器内存储的16位段地址和另一寄存器内存储的16位偏移地址通过某一环节运算得到20位地址,然后选择中内存的位置将其中的东西取出送到cpu里面处理,然后相应的寄存器的值就可能发生改变。

各段地址寄存器:

cs和ip对应代码段地址和偏移地址。 

ds和[address]对应数据段地址和偏移地址。ds不能mov直接赋值数据,而要先将数据mov到通用寄存器ax、bx等中,再间接mov给ds。  通常ds与bx一块,也有si、di(但它们没有八位)

ss对应栈顶的段地址,sp对应栈顶的偏移地址,任意时刻ss:sp指向栈顶元素;因为栈顶位置在执行代码时时刻变化,所以sp时刻变化,ss:sp指向新的栈顶。当栈是空的时候,sp实际指向最高地址的更高一单元,因为每次作用时sp都要下降指向栈顶位置。8086没有栈空间的检查机制,超界了不会提示。push/pop可以同时对段寄存器(cs等)和通用寄存器(ax等)进行操作

字是16位的,字节是8位的,一个内存单元里面是一个字节,如果传送一个字实际上就是传送两个内存单元。字地址对应的是低位地址。

debug命令中:

汇编语言 DOSBox_第1张图片

二 编程

MASM 
f1.asm
link f1.obj
f1.exe
模板:

assume cs:code,ds:data,ss:stack

stack segment
dw '00000000'
stack ends

data segment
db '1.file'
db '2.edit'
data ends

code segment
start:
mov ax,stack
mov ss,ax
mov sp,16
mov ax,data
mov ds,ax
mov bx,0

mov ax,4c00h
int 21h
code ends
end start

实例1 hello,world
assume cs:code,ds:data

data segment
msg db 'hello,world',0AH,0DH,'$'  ;0ah,0dh为换行回车
data ends
code segment
start:	
	mov ax,data
	mov ds,ax
	lea dx,msg
	MOV AH, 09H
	INT 21H
	mov ax,4c00h
	int 21h
code ends
end start
实例3 显示两行字符串
assume cs:code,ds:data,ss:stack

stack segment
buf1 dw 256 dup(?)
stack ends

data segment
mes db 'Press any key to exit!',0AH,0DH,'$'
mes1 db 'Show A as hex:',0AH,0DH,'$'
sd db 'A'
data ends

code segment
start:
mov ax,data
mov ds,ax
mov dx,offset mes
mov ah,09h
int 21h
mov dx,offset mes1
mov ah,09h
int 21h

mov ax,4c00h
int 21h
code ends
end start
例4 所有字母变成大写
例4 加法

基本语法语句:

; cx每次减1,跳到loop处执行;若cx=0,则不再跳转而是向下执行。
也就是说cx先减1再判断是否为0
    mov ax,2
    mov cx,11
s:  add ax,ax
    loop s

inc ax   ;ax自加1
sub ax,1 ;ax减1

and al,11011111 这个字母变成大写
or al,00100000 这个字母变成小写


MOV AH, 9
INT 21H
;输出ds:dx指向的字符串显示在屏幕上,'$'结束字符串
MOV AH, A
INT 21H
;键盘输入到内存缓冲区
MOV AH, 1
INT 21H
;单个字符输入,结果以ASCII存储在AL中
mov DL,'A'
MOV AH, 2
INT 21H
;输出DL中的字符


前面有msg db ''
lea dx,msg ;将ds:dx指向msg字符串的首地址

格式:db 重复的次数 dup (重复的内容)
buf1 db 50 dup(?)   开辟50个字节的内存区

offset 取得标号的偏移地址

你可能感兴趣的:(c语言)