携程 手机号查订单:汇编菜鸟又来

来源:百度文库 编辑:高考问答 时间:2024/05/12 18:36:19
我自己编的,请教过一次。
但是高手自己另外编了一个,里面引用了我不知道的外部文件。
希望高手们能够修改我的程序,指出错误。
跪谢!!

stack_seg segment
db 128 dup(?)
stack_seg ends
data_seg segment
count dw 5
buf dw -1,6,2,5,4,5 dup(?)
max dw ?
min dw ?
data_seg ends
code segment
main proc far
assume cs:code,ds:data_seg,ss:stack_seg
start:sub ax,ax
push ax
mov ax,stack_seg
mov ss,ax
push ds
mov ax,data_seg
mov cx,count
mov bx,0
action2:mov SI,offset buf
mov ax,[SI]
cmp ax,[SI+2]
jl action1
mov ax,[SI]
mov max,ax
mov ax,[SI+2]
mov bx,ax
mov min,bx
add si,2
loop action2
action1:mov ax,[SI+2]
mov max,ax
mov ax,[SI]
mov bx,ax
mov min,bx
add si,2
loop action2
ret
main endp
code ends
end start

你可真固执,好了,我就好人做到底,错误找到了

stack_seg segment stack

db 128 dup(?);
stack_seg ends

data_seg segment

count dw 5;
buf dw -1,6,2,5,4,5 dup(?);
max dw ?;
min dw ?;
data_seg ends

code segment

main proc far

assume cs:code, ds:data_seg, ss:stack_seg;
start:
push ds;
xor ax,ax;
push ax;

mov ax, data_seg;
mov ds, ax;
xor ax, ax;

mov cx, count;
mov bx, 0;
action2: mov SI, offset buf;
mov ax, [SI];
cmp ax, [SI+2];
jl action1;
mov ax, [SI];
mov max, ax;
mov ax, [SI+2];
mov bx, ax;
mov min, bx;
add si, 2;
loop action2;

action1: mov ax, [SI+2];
mov max, ax;
mov ax, [SI];
mov bx,ax;
mov min,bx;
add si,2;
loop action2;

ret;
main endp
code ends
end start

错误主要集中以下代码:
sub ax,ax
push ax
mov ax,stack_seg
mov ss,ax
push ds
mov ax,data_seg

我想你是要完成3个功能:
1. 装载SS段.
2. 装载DS段.
3. 为返回DOS程序做准备

修改后:

push ds;
xor ax,ax;
push ax;

mov ax, data_seg;
mov ds, ax;

以下为你的3个错误做一一解答:

1. 装载SS段不同于装载别的段, 它涉及到两个寄存器,
SS与SP, SP涉及到栈顶, 所以你不能只装载SS,
还需要装载它,你可以在stack_seg的最后添加一个
变量,用于指示栈顶, 然后手动将他装载到SP;
因为这样太麻烦,所以编译器提供了另一种简单的
方法:
将stack_seg设置成stack属性,就是这句
stack_seg segment stack
这样只需建立Assume联系,系统会完成剩下的工作

2. 你只有 mov ax,data_seg 这条指令, 并没有将
装载ds, 应该添加 mov ds, ax, 你太粗心了

3. 返回DOS的代码如下

push ds;
xor ax,ax;
push ax;

行了,满意了吧,好累啊~~~~~~~~

stack_seg segment stack

db 128 dup(?);
stack_seg ends

data_seg segment

count dw 5;
buf dw -1,6,2,5,4,5 dup(?);
max dw ?;
min dw ?;
data_seg ends

code segment

main proc far

assume cs:code, ds:data_seg, ss:stack_seg;
start:
push ds;
xor ax,ax;
push ax;

mov ax, data_seg;
mov ds, ax;
xor ax, ax;

mov cx, count;
mov bx, 0;
action2: mov SI, offset buf;
mov ax, [SI];
cmp ax, [SI+2];
jl action1;
mov ax, [SI];
mov max, ax;
mov ax, [SI+2];
mov bx, ax;
mov min, bx;
add si, 2;
loop action2;

action1: mov ax, [SI+2];
mov max, ax;
mov ax, [SI];
mov bx,ax;
mov min,bx;
add si,2;
loop action2;

ret;
main endp
code ends
end start

你可真固执,好了,我就好人做到底,错误找到了

stack_seg segment stack

db 128 dup(?);
stack_seg ends

data_seg segment

count dw 5;
buf dw -1,6,2,5,4,5 dup(?);
max dw ?;
min dw ?;
data_seg ends

code segment

main proc far

assume cs:code, ds:data_seg, ss:stack_seg;
start:
push ds;
xor ax,ax;
push ax;

mov ax, data_seg;
mov ds, ax;
xor ax, ax;

mov cx, count;
mov bx, 0;
action2: mov SI, offset buf;
mov ax, [SI];
cmp ax, [SI+2];
jl action1;
mov ax, [SI];
mov max, ax;
mov ax, [SI+2];
mov bx, ax;
mov min, bx;
add si, 2;
loop action2;

action1: mov ax, [SI+2];
mov max, ax;
mov ax, [SI];
mov bx,ax;
mov min,bx;
add si,2;
loop action2;

ret;
main endp
code ends
end start

错误主要集中以下代码:
sub ax,ax
push ax
mov ax,stack_seg
mov ss,ax
push ds
mov ax,data_seg

我想你是要完成3个功能:
1. 装载SS段.
2. 装载DS段.
3. 为返回DOS程序做准备

修改后:

push ds;
xor ax,ax;
push ax;

mov ax, data_seg;
mov ds, ax;

以下为你的3个错误做一一解答:

1. 装载SS段不同于装载别的段, 它涉及到两个寄存器,
SS与SP, SP涉及到栈顶, 所以你不能只装载SS,
还需要装载它,你可以在stack_seg的最后添加一个
变量,用于指示栈顶, 然后手动将他装载到SP;
因为这样太麻烦,所以编译器提供了另一种简单的
方法:
将stack_seg设置成stack属性,就是这句
stack_seg segment stack
这样只需建立Assume联系,系统会完成剩下的工作

2. 你只有 mov ax,data_seg 这条指令, 并没有将
装载ds, 应该添加 mov ds, ax, 你太粗心了

3. 返回DOS的代码如下

push ds;
xor ax,ax;
push ax;