用户登录
用户注册

分享至

汇编toplabelword

  • 作者: 咖啡泡饭007
  • 来源: 51数据库
  • 2020-04-21

1.tos label word 在汇编语言什么意思 有什么作用 请高手指点

用法为:

buffer(变量) LABEL WORD(字类型)例如:Buffer1 LABEL WORD

Buffer2 DB 20 DUP (0)

通常,紧接着的下一条语句定义的类型与LABEL指定的类型不同。而实际上,Buffer1是Buffer2的别名,两者指向内存中的同一个存储地址。换言之,同一组数据定义了两种不同的类型,在接受不同数据类型的访问时,可以指定相应的标号。如接受一个字类型数据访问时,使用Buffer1;接受字节类型数据访问时,使用Buffer2。否则因为数据类型不匹配,编译器编译时将出现异常。

说到LABEL,也不得不提到另一个与之功能相近的伪指令THIS。THIS通常也与它的下一条变量定义语句相关,因为在数据类型过多的情况下接受不同数据类型访问时,使用PTR属性限定符显得十分繁琐,比如起初定义了变量:

Buffer1 EQU THIS WORD

Buffer2 DB 20 DUP (0)

假设有如下语句:

mov AX, Buffer1

mov AX, Buffer2

其中,在作字类型访问时,mov AX, Buffer1相当于mov AX, WORD PTR Buffer2,这样省去了繁琐的PTR操作符。

以上两条语句在内存中的安排:

2.汇编 段定义 label

stack定义堆栈段,只是个名字,你也可以改其他。LABEL的功能是定义变量或标号的类型,而变量或标号的段属性和偏移属性由该语句所处的位置确定。例如:

Buffer1 LABEL WORD

Buffer2 DB 20 DUP (0)

通常,紧接着的下一条语句定义的类型与LABEL指定的类型不同。而实际上,Buffer1是Buffer2的别名,两者指向内存中的同一个存储地址。换言之,同一组数据定义了两种不同的类型,在接受不同数据类型的访问时,可以指定相应的标号。如接受一个字类型数据访问时,使用Buffer1;接受字节类型数据访问时,使用Buffer2。否则因为数据类型不匹配,编译器编译时将出现异常。

3.汇编语言堆栈的问题

题目给的是一.LST文件,先还原为PSTACK.ASM

STACKSG SEGMENT STACK

DW 32 DUP(?)

TOP LABEL WORD

STACKSG ENDS

CODESG SEGMENT

ASSUME CS:CODESG,SS:STACKSG

BEGIN PROC FAR

MOV AX,STACKSG

MOV SS,AX

MOV SP,OFFSET TOP

PUSH DS

XOR AX,AX

PUSH AX

CALL B10

RET

BEGIN ENDP

B10: PROC NEAR

CALL C10

RET

ENDP

C10: PROC NEAR

RET

ENDP

CODESG ENDS

END BEGIN

用MASM和LINK汇编链接得PSTACK.EXE

再运行CMD进到命令提示符下:

输入DEBUG PSTACK.EXE(回车),依次键入:

-d:0 显示如下:

13DC:0000 CD 20 FF 9F 。 。

先记下PSP段地址为13DCH;再输入

-r 显示:

DS=13DC ES=13DC SS=13EC CS=13F0 IP=0 。

再输入

-t=0

-t

输入n个t后,到IP=40时,SP=0038H,堆栈最满.

此时执行

-dss:0,显示:

13EC:0030 00 00 14 00 F0 13 F0 0D-13 00 0F 00 00 00 DC 13

由于每台电脑执行程序时,浮动地址不一,题目给定

PSP=1234H,与本机PSP段地址为13DCH相差后,依次填入下表:

位移 栈内容 [十六进制]

(0032) (0014) ;IP 入栈

(0034) (1248) ;CS 入栈

(0036) (0584)

(0038) (0013) ;IP 入栈

(003A) (000F)

(003C) (0000);push ax 时入栈的数据

(003E) (1234);push ds 时入栈的段址

SP=0038H

4.找个高手帮忙分析下汇编程序

注释前面有感叹号的是我加的提示或者修改,请过目:

DATA SEGMENT

N DB 6 ; 前N项和的N

DATA1 DW 0 ; 保存结果

DATA ENDS

STACKS SEGMENT ;!其实这个程序没用到栈

DW 100H DUP(?) ; 256字节的栈空间

TOP LABEL WORD ; top保存栈顶位置

STACKS ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:

MOV AX,DATA ; 初始化数据段

MOV DS,AX

MOV AX,STACKS ; 初始化栈顶

MOV SS,AX

LEA SP,TOP ; sp指向栈定

MOV CL,N ; 初始化cx为循环次数N

MOV CH,0

XOR AX,AX ; 初始化ax,保存累加结果

MOV BX,1 ; 首项为1

CMP CX,0 ; 如果N == 0则直接结束程序

JE a2

a1: ADD AX,BX ; 保存累加结果到ax

INC BX ;!这句错了吧,应该是add bx, 2

LOOP a1 ; 循环求解

mov DATA1, ax ;!加一句保存结果吧

a2:

MOV AH,4CH ; 结束程序

INT 21H

CODE ENDS

END START

DATA SEGMENT

STRING1 DB 'MATCH!',0AH,0DH,'$'

STRING2 DB 'NO MATCH!',0AH,0DH,'$'

DATA ENDS

CODE SEGMENT

ASSUME CS:CODE,DS:DATA

START:

MOV AX,DATA

MOV DS,AX

MOV AH,01H ; 调用01号dos功能从键盘接收一个字符的输入

INT 21H ; al是输入的字符

CMP AL,'Y' ; 比较al和字符'Y'

JNZ NEXT ; 不相等则跳到next处执行

MOV AH,09H ; 调用09号dos中断输出字符串

LEA DX,STRING1 ; 输出match

INT 21H

JMP EXIT0 ; 跳至程序结尾,结束程序

NEXT:

MOV AH,09H ; 调用09号dos功能输出字符串

LEA DX,STRING2 ; 输出no match

INT 21H

EXIT0:

MOV AH,4CH ; 结束程序

INT 21H

CODE ENDS

END START

5.一段很简单的汇编程序

楼主,你这个也没有实质性的程序啊!除了数据段的定义,就是堆栈段的定义,没什么好注释的。若非要注释,只能把这两个段给你区分开,别的真就没什么可注释的了。

stack segment para stack 'stack' ;定义堆栈段

db 256 dup(0) ;用db不正确,应该用dw,堆栈段都是自数据

top label word ;top堆栈指针

stack ends

data segment para public 'data' ;定义数据段

. ;中间这些都是定义的一些数据

.

.

data ends

code segment ;定义代码段

assume cs:code,ds:data,es:data,ss:stack ;段寄存器说明

start: ;代码段开始

mov ax,data

mov ds,ax

mov es,ax

.

.

.

mov ah,4ch ;dos功能调用4ch号功能,结束程序,返回操作系统

int 21h ;dos功能调用

code ends ;代码段结束

end start ;编译结束伪指令

转载请注明出处51数据库 » 汇编toplabelword

软件
前端设计
程序设计
Java相关