汇编学习笔记(4)

data segment
hz db 04h,80h,0eh,0A0h,78h,90h,08h,90h




code segment

main:
	mov ax,data
	mov ds,ax
	
	mov 

check_next_dot:
	
next_row:
	mov ah,hz[si]
	mov al,hz[si+1]
	
	jnc no_dot;若没有进位,即cf=0,则跳到no_dot,cf(进位),刚移出的位会自动进入CF(进位标志)
code ends
  • 0000:0000

  • F000:0000~F000:FFFF;ROM

  • A000:0000~A000:FFFF:显卡

  • B800:0000~B800:FFFF;显卡

  • C000:0000~C000:FFFF;ROM

  • 程序可以使用的内存空间

    • 0000:0000~9000:FFFF,640k大概有100k被dos使用
  • assume的作用

    • assume不会对于ds,es进行赋值,只是会替换
    • 常数段地址,段寄存器
    • 在编译的时候替换
    • 在程序刚开始运行时,ds=es=psp=程序的首段地址-10h,psp:program segment prefix,长度为100h字节
    • psp中存放了一些命令行参数
    • psp:80h开始存放命令行参数
    • psp:80 命令行参数的长度,单位是字节
    • psp:81-psp:ff为命令行参数的内容,空格也算是命令行参数的内容,回车没有算在命令行参数长度内,不计数但是会保存
    • psp:16h 父程序的psp段地址
    • cd 20一定是psp的前两个字节,对应int 20h(结束程序的运行)
  • 当程序刚开始运行时,cs:ip,ss:sp会由操作系统自动对他们进行赋值,用户不需要手工复制,这4个寄存器的值保存在exe的文件头重,其中cs,ss保存的时相对值,sp和ip保存绝对值

    • end main决定了程序开始的第一个条指令的地址,取main的偏移地址为0,即ip为0,这个ip就是main的偏移地址,ip(instruction potion),每个段的段地址都表示为该段段地址减去首段段地址之差
    • cs的相对地址=code-首段地址即data
    • sp=堆栈的长度
    • ss的相对值=stk-首段地址即data
  • assume对同一个段与多个段寄存器有关联

    • ds>ss>es>cs

日本語の

  • 堆栈

    • ;code和data段可以定义多个
      stk segment stack;堆栈只能定义一个
      db 200h dup('S');200h的数组,每个元素内容均为S,无名数组,sp=200h
      stk ends
      
    • 只允许push 16,32位

data1 segment
data1 ends

data2 segment
data2 ends

code segment
assume cs:code,ds:data1

FL标志寄存器

FL共16位,但只用其中9位,6个状态标志和3个控制标志

11 10 9 8 7 6 4 2 0

CF:进位标志(carry flag)

mov ah,0ffh

add ah,1;ah=0,cf=1产生了进位,最高位产生了进位

减法产生了借位,cf也变成了1

左移和右移也会产生一个进位

左移和右移丢失的位会保存到cf中

jc 有进位 jmp

jnc没有进位

adc add with carry

clc ;使cf=0

stc;使cf=1

cmc;使cf反转

jb等效于jc

mov ax,1
mov bx,2
sub ax,bx;
jb next| jc next;两个等效,都是根据cf进行跳转

adc ah,0 ;ah=ah+0+cf

data segment
abc db 7fh
s db 8 dup(0),0Dh,0Ah,'$'
data ends

code segment

main:
	mov ax,data
	mov ds,ax
	
next:
	shl al,1;左移一位
	mov dl,'0'
	adc dl,0;dl=dl+0+cf,判断0和1的好方法
	

mov指令不影响任何标志位

跟计算的指令会影响标志位,而mov指令不影响标志位

  • ZF

    • 零标志(zero flag)

    • sub ax,ax;AX=0,zf=1,zero is true
      add ax,1;ax=1,zf=0
      ;如果换成了mov ax,1;ax=1,zf=1
      jz|je;je,jz都是根据zf=1进行跳转
      jnz|jne
      
      mov ax,123
      mov bx,123
      cmp ax,bx;zf=1
      
  • SF

    • 符号标志(sign flag)

    • mov ah,7fh
      add ah,1;ah=80h,sf=1(运算结果的最高位,即符号位),为1表示负数,0为证书
      sub ah,1;ah=7fh,sf=0
      
      jns;sf==0跳
      js;sf==1跳
      
  • OF

    • 溢出标志(overflow flag)

    • mov ah,7fh
      add ah,1;ah=80h,of=1,正数加正数为负数,一处
      mov ah,80h
      add ah,0FFh;ah=7fh,of=1负数加负数为正数,溢出
      ;正负运算不会溢出
      jo;of==1
      jno;of==0
      

在这里插入图片描述
在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值