首页 > 软件 > 输入字符串,不知道字符个数所以定义了DB ?,但后来直接把?mov到cl里循环,为什么可以这样呢

输入字符串,不知道字符个数所以定义了DB ?,但后来直接把?mov到cl里循环,为什么可以这样呢

软件 2023-11-09

汇编语言编程

;编写多字节有符号数的加法程序,从键盘接收两个加数,在屏幕上显示结果。

;16位有符号数加减运算

assume cs:codesg,ds:datasg,ss:stacksg

datasgsegment

input1 db 'Inputfirstnumber!','$'

input2 db 'Inputsecondnumber!','$'

result db 'Sumis:','$'

;21号中断10号例程,存放输入数据

add1 db 6 ;缓冲区最大容量

db ? ;实际上接收字符的个数,不包括最后的回车

db 6dup(?) ;存放输入的字符,回车结尾

add2 db 6

db ?

db 6dup(?)

num dw ? ;存放中间结果

sign db ? ;两个数和的符号位

sum dw 10dup(?) ;两个数的和

datasgends

stacksgsegment

stacksgends

codesgsegment

start: mov ax,datasg

mov ds,ax

lea dx,input1

mov ah,9

int 21h

;读取第一个加数

mov dx,offsetadd1

mov ah,10

int 21h

;取光标位置,ah为行,al为列

mov ah,3

mov bh,0

int 10h

;设置光标位置

mov ah,2

mov bh,0

inc dh

mov dl,0

int 10h

lea dx,input2

mov ah,9

int 21h

;读取第二个加数

mov dx,offsetadd2

mov ah,10

int 21h

;取光标位置,ah为行,al为列

mov ah,3

mov bh,0

int 10h

;设置光标位置

mov ah,2

mov bh,0

inc dh

mov dl,0

int 10h

lea dx,result

mov ah,9

int 21h

;转换第一个数字,并设置字符串个数

mov bx,offsetadd1

mov cl,[bx+2]

push cx ;保存符号位

xor dx,dx

;确定第一位是数字不是符号位

cmp cl,30h

jb pos1

cmp cl,39h

ja pos1

mov dl,[bx+1] ;然后确定数字长度

add bx,2

mov ax,bx ;确定字符串首地址

jmp convert1

pos1:

mov dl,[bx+1]

dec dl ;确定数字长度

add bx,3

mov ax,bx ;确定字符串首地址

convert1:

push dx

push ax

call DeciToBina

pop cx ;取出符号位

cmp cl,2dh

jnz sign1 ;不为负号则不变

neg ax

sign1:

lea bx,num

mov [bx],ax ;保存第一个数

;转换第二个数字

mov bx,offsetadd2

xor dx,dx

mov cl,[bx+2] ;测试符号位

push cx

cmp cl,30h

jb posi2

cmp cl,39h

ja posi2

mov dl,[bx+1] ;保存数字字符串长度

add bx,2

mov ax,bx ;保存数字字符串首地址

jmp convert2

posi2:

mov dl,[bx+1]

dec dl ;保存数字字符串的长度

add bx,3

mov ax,bx ;保存数字字符串首地址

convert2:

push dx

push ax

call DeciToBina

pop cx

cmp cl,2dh

jnz sign2

neg ax

sign2:

lea bx,num

add ax,[bx]

;设置结果的符号

push ax

and ax,1000000000000000b

neg ax

sbb ax,ax

neg ax

lea bx,sign

cmp ax,1

jnz sign3

mov byteptr[bx],'-'

pop ax

neg ax ;如为负数,则求出结果的绝对值

jmp output

sign3:

mov byteptr[bx],'+'

pop ax

;转为ascii码输出

output:

push ax

lea bx,sum

push bx

call BinaToDeci

lea dx,sign

mov ah,9

int 21h

;取光标位置,ah为行,al为列

mov ah,3

mov bh,0

int 10h

;设置光标位置

mov ah,2

mov bh,0

inc dh

mov dl,0

int 10h

mov ax,4c00h

int 21h

;***********************************************************************

;作用:将十六进制数,转为十进制字符,用以输出

;形式:voidBinaToDeci([buff],int),从右向左依次压入堆栈

;参数1:第一个参数[buff]:接收结果的缓冲区地址

;参数2:第二个参数int:待转换的十六进制数字

;返回值:无,直接保存到内存中

;***********************************************************************

BinaToDeci proc

push bp

mov bp,sp

push ax

push bx

push cx

push dx

mov cx,0 ;初始化计数器,记录循环次数,即十进制数的位数

mov ax,[bp+6] ;取出传入的待转换十六进制数,段内调用只加6,段间调用加8

;计算出十进制各位数字,并保存到堆栈

bina_next:

xor dx,dx

mov bx,10

div bx

push dx

inc cx

cmp ax,0

jz bina_end

jmp bina_next

bina_end:

mov bx,[bp+4] ;取出保存十进制数的缓冲区首地址

;将十进制的各个位数转换成ascii码,并存入指定的内存区域

bina_next2:

pop ax

add ax,30h

mov byteptr[bx],al

inc bx

loop bina_next2

;字符串以'$'结尾,用以调用21号中段的9号例程

mov byteptr[bx],'$'

pop dx

pop cx

pop bx

pop ax

mov sp,bp

pop bp

ret 4

BinaToDeci endp

;***********************************************************************

;***********************************************************************

;作用:将十进制字符,转换为十六进制数,用以计算

;形式:voidDeciToBina([buff],int),从右向左依次压入堆栈

;参数1:第一个参数[buff]:放置十进制数字字符串的缓冲区的首地址

;参数2:第二个参数int:十进制字符串的字符个数

;返回值:十六进制的数字

;***********************************************************************

DeciToBina proc

push bp

mov bp,sp

push bx

push cx

push dx

push si

mov bx,[bp+4] ;取放置十进制字符串缓冲区的首地址

mov cx,[bp+6] ;十进制数字字符串的字符个数

xor ax,ax

;将ascii码还原为数字,并保存到堆栈

deci_next:

mov al,byteptr[bx] ;依次取缓冲区内的字符

sub al,30h

push ax

inc bx

loop deci_next

mov cx,[bp+6] ;再次获得字符的个数

xor ax,ax

xor dx,dx

mov bx,1 ;用作乘数

xor si,si

;各位相乘然后累加获得十六进制数值

;结果=个位*1+十位*10+百位*100+千位*1000

deci_next1:

pop ax ;取出数字

mul bx ;相乘

add si,ax ;累加结果

;计算下次相乘时的乘数

mov ax,bx

mov bx,10

mul bx

mov bx,ax

loop deci_next1

;将结果存入ax,为返回值

mov ax,si

pop si

pop dx

pop cx

pop bx

mov sp,bp

pop bp

ret 4

DeciToBina endp

;***********************************************************************

codesgends

endstart

汇编语言程序设计题

; 本程序通过编译,运行正确 Data Segment org 200h Data_BCD db 58h ;两位BCD码 db ?,? ;保存转换后的ASCII码 Data Ends Code Segment Assume CS:Code,DS:Data Start: mov ax,Data mov ds,ax ;数据段段地址 mov al,Data_BCD ;取两位BCD码 xor ah,ah ;累加器高位字节清零 mov cx,4 ;逻辑左移、右移次数 shl ax,cl ;ax左移4位,把两位BCD码的高4位移到累加器高字节 shr al,cl ;把两位BCD码的低4位移回原位置,实现两

汇编语言中字符串的使用

mov dl,[len1] mov ah,02h int 21h ---- 呵呵,输出,不是这样简单的。 len1,是二进制数字,必须把它变成十进制的个位、十位.., 再把各位数,都变换成ASCII码,放到DL中,最后才能输出到显示屏。

汇编程序题目

1、 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- ..... ;确定数据段段地址 mov ax,data mov ds,ax ..... ;(1) mov ax,x sub ax,05h mov y,ax ;(2) mov ax,x add ax,0ah mov y,ax 2、有注释的 -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=- data segment BUFF db 127 ;开始建立输入缓冲 db ? db 127 dup(?) NUMBER db 127 du

汇编语言编程

dseg segment buff db 12,?,12 dup(?) dseg ends cseg segment assume ds:dseg,cs:cseg begin: mov ax,dseg mov ds,ax lea dx,buff mov ah,10 int 21h ;以上是输入字符串(最多11个字符,要是想输入更多,可以把buff变大,把12换成一个更大的数) mov dl,0ah mov ah,2 int 21h mov dl,0dh int 21h ;以上是换行 mov ah,1 int 21h ;读入要查找的字符个数 mov cl,buff+1 xor ch,ch lea

标签:汇编语言 编程 计算机 编程语言 信息技术

大明白知识网 Copyright © 2020-2022 www.wangpan131.com. Some Rights Reserved. 京ICP备11019930号-18