❶ 汇编语言中数组如何保存
汇编这样可以直接读写内存的程序也需要用到变量。但它不像其它高级语言那样把变量分成许多类型,它是按照变量的长度来区分的,所以定义(define)变量时就用5个不同的关键字:db,dw,dd,dq,dt(事实上常用的只有db,dw)
db(define
byte)即定义的变量占一个字节的长度(也可以说把定义的变量值放入一个字节的内存空间)
如:
a
db
7h
;意思是将7h放入内存的某一个键答辩字节(空间)中,然后让变量a指向这个字节
也可以这样:
a
db
'h'
;虽然‘h’是个字符但存入内存却成了它对应的ascii码48h
你也可以用db来定义数组,如:
a
db
48h,
65h,
6ch,
6ch,
6fh,
00h
b
db
'hello',
0
这样定义出来的a和b中的元素是完全相同的。
可以作如下引用:
mov
al,
a[3]
也可以用指针和变址寄存器(bx,
si,
di,
bp):
mov
si,
3
mov
al,
a[si]
如果你想定义一个具有一系列相同元素的数组可以用p关键字,如:
c
db
5
p(9)
与下面的效果相同:
c
db
9,
9,
9,
9,
9
d
db
5
p(1,
2)
相同于:
d
db
1,
2,
1,
2,
1,
2,
1,
2,
1,
2
如果你想把一个超过1字节的值用db来定义是不可能实现的,编译器会报错,如:
a
db
1234h
;编译时是不能通过的,报错信息:cannot
convert
word
to
byte!
另外p的第一个操作数就是例子中的5,不能超过1020,否则会报错:p
expansion
is
over
1020
chars!
以上是举败db的用法剩下的dw,dd,dq,dt与之大至相同,除了它们不能定义字符数组(因为ascii码值就是0..255,一个字节肯稿缺定能放下一个字符的ascii码值)
dw(define
word)定义一个字(两个字节)长度
dd(define
double
word)定义双字(4个字节)长度
dq(define
quartet
word)定义四字(8个字节)长度
dt(define
ten
byte)定义十字节长度
❷ 求解一个简单的汇编语言程序:给一段数据,将数据存储到数据段中。(最好添加注释)在线等!小女子不胜感激
这个登陆器是用易语言做的,而下载的时候应该是又一个dp1.fne支持库文件的,可能打包后被意外删除了,或者被你桥虚禅意外删除了,你可以下载一个精简版的易语言,然誉毕后放着,不用去管它,就可敏尘以用了,当然你也可以换一个登陆器。
精简版下载地址(官方网站):
❸ 汇编语言怎么从键盘输入一个十进制的两位数,并把它存到数组里面
以下是输入岩袭数组的子程序(注意其数据定义与代码段同段)
;===================================================
; 键盘输入数值数组子程序(数粗族兄组名为@array,元素个数存放在@num中)
; 可以是负数
INPUTNUM PROC NEAR
PUSH AX
PUSH BX
PUSH CX
PUSH DX
PUSH SI
PUSH DI
PUSHF
; 对数组@array清零
MOV CX,100
MOV AX,0
LEA DI,@ARRAY
REP STOSW
MOV WORD PTR @NUM,0
; 输入的数据以穗团一个空格分隔,以回车符结束输入
LEA DX,@STRA
MOV AH,10
INT 21H
MOV CL,@STRN
MOV CH,0
MOV WORD PTR @STRM,CX
LEA SI,@STR
CLD
LEA DI,@ARRAY
MOV WORD PTR @NUM,0
@STIN:
MOV AX,0
PUSH AX
MOV BYTE PTR @SIGNN,0
@AGAIN1:
CMP WORD PTR @STRM,0
JE @LINE0
LODSB
DEC WORD PTR @STRM
CMP AL,' '
JE @LINE0
CMP AL,'-'
JNE @INPUT1
MOV BYTE PTR @SIGNN,1
JMP @AGAIN1
@INPUT1:
SUB AL,30H
MOV AH,0
MOV BX,AX
POP AX
MOV CL,10
MOV CH,0
MUL CX
ADD AX,BX
PUSH AX
JMP @AGAIN1
@LINE0:
POP AX
CMP BYTE PTR @SIGNN,1
JNE @INPUT2
NEG AX
@INPUT2:
MOV WORD PTR[DI],AX
INC WORD PTR @NUM
CMP WORD PTR @STRM,0
JE @STINEND
INC DI
INC DI
JMP @STIN
@STINEND:
POPF
POP DI
POP SI
POP DX
POP CX
POP BX
POP AX
RET
@STRA DB 255
@STRN DB ?
@STR DB 255 DUP(?)
@STRM DW 0
@ARRAY DW 100 DUP(0)
@NUM DW 0
@CHAR DB ?
@SIGNN DB 0
INPUTNUM ENDP
;=========================================
❹ 如何用汇编语言将一串数据中的正数放入以BUFFER为首地址数据缓冲区中
定义一个数据缓冲区
buff db n,?,n p(0)
其中n表示的是要输入缓冲区的最大个数,?表示实际的个数闹世(由系统来敬弯缺算)
然后比较缓冲区中的数和实际的输入个数,
如果大于,则出现字符丢失并且响铃
如果小于则填充亮辩零
然后在code segment 中定义相应的输入中断
即:
mov ah 10
mov dx, offset buff
int 21h
❺ 汇编语言内存中数据存放
22 低地址
11
44
33 高地址
每个dw的高地址团数存放高位数据,低伍念地址存放低位数据。
8086汇编中数据是存放在数据段的,所有从低地址到高地址的塌橘首存放。你在访问3344H时可以直接用[num+2]来访问。
需要区别的是windows的栈内存,是从高地址到低地址存放的。
❻ 求助!汇编语言如何将一个地址值存入寄存器
首先,MOV AL,buf
与 MOV AL,[buf] 没有任何区别,都是将变搜梁量BUF的值送AL。(BUF必须是用DB定义的字节变量)。
想将buf的地址值存入AL,这是不可能的桥漏毕,因为AL是8位,而地址是16位。
如果是想敏芹将buf的地址值存入AX,可用以下指令:
LEA AX,buf
或
MOV AX,OFFSET buf
❼ 用汇编语言实现从键盘读一行信息,并存入用户定义的缓冲区buffer。如从键盘输入”myfriends”
data segment
buffer db 100,?,100 p(0)
data ends
code segment
assume cs:code,ds:data
begin:
mov ax,data
mov ds,ax
lea dx,buffer
mov ah,10
int 21h ;用dos的10号功能调用实现输入一个字符串并存到内存缓冲袜梁慎告敬区
mov ax,4c00h
int 21h
code ends
end begin
汇编连接生成exe文件后,用debug加载运行。
运行结束后,用d命令渣凳查看数据段,
buffer开始的单元,第一个字节是定义的缓冲区的大小,第二个字节存放的是程序运行时输入的字符个数,从第三个字节开始才是输入的字符串的ascii码